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

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

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

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

おすすめ記事