systemdサービスデバイスRestart = on-failureはデーモンプロセスを再起動しません。

systemdサービスデバイスRestart = on-failureはデーモンプロセスを再起動しません。

デーモンプロセスを開始して終了したら、再起動するサービス単位ファイルを作成したいと思います。私は持っています:

[Unit]
Description=lmgrd

[Service]
User=flexlm
Group=flexlm
ExecStartPre=/usr/bin/cp /nfs/lmgrd/* /lm/
ExecStart=/lm/lmgrd -c /lm/license.lic -l /lm/lmgrd.log
Restart=on-failure
RestartSec=3
RemainAfterExit=yes
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

ファイルをコピーしてデーモンを起動しますが、デーモン(lmgrd)を終了しても再起動されません。この問題をどのように解決できますか?

答え1

systemdがサービスを考えているので、再起動しないようです。いいえまずデーモンプロセスを実行します。デーモンがまだ生きている間に見ると、systemctl status「ステータス:アクティブ(終了)」が表示され、デフォルトのPIDが表示されないことがあります。

デフォルトでは、FlexLM lmgrdはクロス(デーモン)開始;初期プロセスはほぼ直ちに終了し、サブプロセスは追跡する必要がある「基本」デーモンです。

問題は、systemdがまだこれについて聞いていないことです。サービスにType =設定がなく、デフォルトは実際にはType = simpleであり、systemdにトレースを指示します。初期のしかしそれを扱いなさい。したがって、lmgrdがデーモン化されると、systemdは「デフォルト」プロセスが終了したと見なし、通常サービスが停止したことを報告します。

あなたの場合はまだシステム化されています。〜であるふりをするRemainAfterExit = yesが設定されているため、サービスはまだ「アクティブ」状態ですが、実際には追跡されていないプロセスはありません。実行中のlmgrdプロセスは残りの子/ワーカープロセスと見なされ、そのシャットダウンはもはやサービスの状態には影響しません。

この問題を解決するには、このRemainAfterExit=オプションを削除してくださいそしてこのType=forkingオプションを追加してください。後者は、「デーモン化」または「バックグラウンドに分岐」するサービスを処理する正しい方法です。 (Systemd は「PID ファイル」を必要としない基本プロセスを自動的に決定します.)

または、Type = simpleを維持できますが(RemainAfterExitは削除します)、次のようにプロセスを構成します。いいえdaemonize – FlexLMには-z「フォアグラウンドで実行」オプションがあります。

(Type = simpleが推奨されることがよくありますが、常に良い選択ではありません。Type = forkingはsystemdに通知する利点もあります。いつサービスはすでに準備されており、Type = simpleの「単純さ」の利点を上回ることがよくあります。これは、デーモンが「デーモン化」時間を正しく測定した場合(lmgrdはそうではありません)と、システムがこのサービスに依存するサービスで構成されている場合にのみ重要です(この場合はそうでない可能性があるために機能します)-z

通常、問題のExecStartが実行されていない限り、RemainAfterExit = yesを使用しないでください。予想される終了します。ほとんどの場合、Type = oneshotを使用してこれらのサービスを実行することもできます。たとえば、nftプロセスが終了した後もファイアウォールルールセットがロードされたままであるため、nftables.serviceはこのオプションを使用できます。ただし、長寿命デーモンの場合、RemainAfterExit = yesの唯一の効果は否定的です。これはsystemdが失敗を無視します。


追加の注意事項としてsystemd確かにExecStartでワイルドカード文字を展開します(このコマンドはシェルなしで実行されるため、通常のシェル演算子は機能しません)。このコマンドはというリテラルをコピーしようとします*

ディレクトリの内容を繰り返しコピーするには、それを変更する必要があります。

ExecStartPre=/usr/bin/cp -rv /nfs/lmgrd/. /lm/

または、ワイルドカード拡張用にシェルを実行します。

ExecStartPre=/bin/sh -c "cp -v /nfs/lmgrd/* /lm/"

関連情報