プロセスがバグアウトしないように定期的に再起動する必要がある単純なsystemdサービスがあります。 systemdサービスを定期的に再起動するための構成オプションはありますか?全ての - Restart*
options は、終了時にサービスを再起動することに関係しているようです。
はい。サービスをType=notify
にすることで、サービスを定期的に再起動させることができます。 Restart=always
とともにサービスファイルの[Service]セクションにこのオプションを追加し、WatchdogSec=xx
を指定します。ここで、xxはサービスを再起動する秒単位の期間です。ここでは、xx時間後にsystemdによってプロセスが強制終了され、systemdによって再起動されます。例えば.
[Unit]
.
.
[Service]
Type=notify
.
.
WatchdogSec=10
Restart=always
.
.
[Install]
WantedBy= ....
これは、質問が行われた時点では存在しなかった可能性がありますが、現在は RuntimeMaxSec
というオプションがあり、指定された期間実行された後にサービスを終了します。 。
例えば.
[Service]
Restart=always
RuntimeMaxSec=604800
私には、これは悪用Type=notify
およびWatchdogSec
。
私は解決策を見ました ここ それは少し回り道ならエレガントに見えました。重要なアイデアは、タイマーをトリガーとしてワンショットサービスを作成し、anotherサービスを再起動することです。
タイマーの場合:
[Unit]
Description=Do something daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
ワンショットサービスの場合:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl try-restart my_program.service
Ubuntu 16.04 LTSのワンショットサービスの場合:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/bin/systemctl try-restart my_program.service
このソリューションでは、一定の時間が経過した後だけでなく、特定の時刻にサービスを再起動する機能など、systemdのタイマーを活用できます。
のようなcrontabはどうですか
30 3 * * Sun /bin/systemctl restart yourService
毎週日曜日の午前3時30分にサービスyourServiceが再起動されます。
最終的に同じ目標を達成するためのいくつかの代替アプローチ:
にコメントしたかった
[Service]
Restart=always
RuntimeMaxSec=604800
上記に答えてくださいが、それ以上のポイントはありません。
コメントは、このソリューションがOnFailure=failure_handling.service
で設定された障害処理を呼び出すということです。スケジュールされた再起動は実際の障害ではないため、障害処理サービスからのロギングや通知などは不要であり、おそらく混乱を招くでしょう。
実際の定期的な再起動はsystemdにとって賢明な機能ですが、息を止めません。