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