システムサービスファイルの動的論理

システムサービスファイルの動的論理

init.d次のコードを含むサービスファイルを再構築しようとしています。

    if [ ! -r /var/spool/torque/server_priv/serverdb ]; then
            DAEMON_SERVER_OPTS="-t create $DAEMON_SERVER_OPTS"
    fi
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_SERVER_OPTS

私はそれを次のように書きます:

[Service]
Type=forking
ExecStart=/usr/sbin/pbs_server
PIDFile=/var/spool/torque/server_priv/server.lock

ifしかし、systemdでコンテンツを表現する方法がわかりません。

答え1

すでに述べたように、複雑なロジックは意図的にサポートされていませんsystemd。起動ロジックを実行する必要がある場合(デーモン自体の一部ではない)、小さなシェルスクリプトを作成しますExecStart=

しかし、考慮すべき事項があります。シェルスクリプト必然ではないプロセス管理を直接実行します。シェルスクリプト〜しなければならない exec悪魔。これは、systemdの独自のプロセスの監視と管理を妨げないようにするためです。

無効なシェルスクリプトの例:

#!/bin/sh
if [ ! -r /var/spool/torque/server_priv/serverdb ]; then
        DAEMON_SERVER_OPTS="-t create $DAEMON_SERVER_OPTS"
fi

$DAEMON -- $DAEMON_SERVER_OPTS

これはデーモンをシェルインタプリタの子プロセスにします。デーモンが分岐しておらず、準備プロトコル(Type=)がオンになっている場合、simpleこれはアイドル冗長プロセスです。そうでなくデーモンが分岐してそれを設定すると、Type=forkingすべてが二重分岐ではなく三重分岐になり、systemdはデーモンを終了します。

正しいシェルスクリプトの例:

#!/bin/sh
if [ ! -r /var/spool/torque/server_priv/serverdb ]; then
        DAEMON_SERVER_OPTS="-t create $DAEMON_SERVER_OPTS"
fi

exec $DAEMON -- $DAEMON_SERVER_OPTS

これはシェルプロセスをデーモンプロセスに置き換えます。

答え2

あなたはこれが好きではありません。しかしそれは働きます:

ExecStart=/bin/bash -c '\
    if [ ! -r /var/spool/torque/server_priv/serverdb ]; then \
            DAEMON_SERVER_OPTS="-t create $DAEMON_SERVER_OPTS"; \
    fi; \
    exec /usr/sbin/pbs_server -- $DAEMON_SERVER_OPT'

答え3

systemdにはそのような機能はありません。これは実際にはデーモンの内部に属するからです。ただし、問題のあるデーモンを変更できない場合は、まずファイルが存在することを確認し、適切な環境変数を生成する単純なユニットを作成してから、ユニットに「EnvironmentFile =」を追加して問題を解決できます。また、環境変数を作成したユニットの後にユニットが常に実行されるように依存関係を追加してください。

関連情報