新しいサービス_foo_daemon
_のsystemd
スクリプトを作成するように依頼されました。このスクリプトは時々「不良状態」になり、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
__foo_daemon
_のsystemd
スクリプトを設定して、ユーザーがサービスを停止/再起動しようとするたびにsystemd
が次のようになるようにするにはどうすればよいですか。
SIGTERM
を介して_foo_daemon
_の正常なシャットダウンを試みます。foo_daemon
_のシャットダウン/終了が完了するまでに最大2秒かかります。SIGKILL
を介して_foo_daemon
_の強制シャットダウンを試みます(したがって、PIDがリサイクルされ、systemd
が誤ったPIDに対してSIGKILL
を発行するリスクはありません)。私たちがテストしているデバイスは、多数のプロセスを迅速に生成/フォークします したがって、問題を引き起こすPIDリサイクルについては、まれですが非常に現実的な懸念があります。SIGKILL
を発行するだけで問題ありません。systemdはすでにこれをそのままサポートしており、 デフォルトで有効 です。
カスタマイズする必要があるのは、TimeoutStopSec=
で実行できるタイムアウトだけです。例えば:
[Service]
TimeoutStopSec=2
これで、systemdはSIGTERMを送信し、サービスが終了するまで2秒待機します。終了しない場合は、SIGKILLを送信します。
サービスがsystemdに対応していない場合は、PIDFile=
を使用してPIDファイルへのパスを提供する必要がある場合があります。
最後に、デーモンが多くのプロセスを生成すると述べました。この場合、KillMode=control-group
を設定すると、systemdがcgroup内のすべてのプロセスにシグナルを送信します。
Type=oneshot
、タイムアウトエラーのために終了する完全な例を次に示します。
[Unit]
Description=timeout test
[Service]
Type=oneshot
TimeoutStartSec=2
ExecStart=/bin/sleep 10