バックグラウンド
systemd
新しいサービスのスクリプトを作成するように依頼されました。これはfoo_daemon
、「悪い状態」になることもあり、経由しないこともありますSIGTERM
(カスタムシグナルハンドラのせいで)。これは、次の方法でサービスを開始/停止/再起動するように指示されているため、開発者にとって問題です。
systemctl start foo_daemon.service
systemctl stop foo_daemon.service
systemctl restart foo_daemon.service
問題
時には、foo_daemon
悪い状態になるために、強制的に強制終了する必要があります:
systemctl kill -s KILL foo_daemon.service
質問
どのようにすることができますが、私のセットアップ私のsystemd
ためのスクリプトをfoo_daemon
するように、停止へのユーザーの試みは/サービスを再起動するたびに、systemd
以下となります。
foo_daemon
viaの正常なシャットダウンを試みSIGTERM
ます。- シャットダウン/終了が
foo_daemon
完了するまで最大2秒かかります。 - プロセスがまだ有効な場合は、
foo_daemon
viaの強制シャットダウンを試行しSIGKILL
ます(したがって、PIDがリサイクルされたり、間違ったPIDに対してsystemd
問題が発生するリスクはありませんSIGKILL
)。私たちがテストしているデバイスは、多数のプロセスを迅速に生成/分岐するため、PIDリサイクルが問題の原因となることはめったにありませんが、非常に現実的な懸念があります。 - 実際に、PIDのリサイクルについて単に妄想しているだけであれば、スクリプトは
SIGKILL
、リサイクルされたPIDを殺すことを心配せずに、プロセスのPIDに対して発行するだけで構いません。
2
2秒で400万以上のPIDを処理するのに十分な速さでプロセスを生成したとしても、systemd は「このpidはまだ生きていますか?このpidはまだ生きていますか?」チェックをループしません。必要がないからです。直接の子プロセスがまだ生きているかどうかについてはすでに通知されています(通常のSIGCHLDとwaitpid()によって)。したがって、プロセスがSIGTERMの後に終了したことがわかると、その時点でサービスを単に「非アクティブ」としてマークします。SIGKILLの確認、待機、送信は一切行いません。
—
-grawity