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 =」を追加して問題を解決できます。また、環境変数を作成したユニットの後にユニットが常に実行されるように依存関係を追加してください。