web-dev-qa-db-ja.com

systemdサービスを定期的に再起動するように設定するにはどうすればよいですか?

プロセスがバグアウトしないように定期的に再起動する必要がある単純なsystemdサービスがあります。 systemdサービスを定期的に再起動するための構成オプションはありますか?全ての - Restart* options は、終了時にサービスを再起動することに関係しているようです。

37
wes

はい。サービスをType=notifyにすることで、サービスを定期的に再起動させることができます。 Restart=alwaysとともにサービスファイルの[Service]セクションにこのオプションを追加し、WatchdogSec=xxを指定します。ここで、xxはサービスを再起動する秒単位の期間です。ここでは、xx時間後にsystemdによってプロセスが強制終了され、systemdによって再起動されます。例えば.

[Unit]
.
.

[Service]
Type=notify
.
.
WatchdogSec=10
Restart=always
.
.

[Install]
WantedBy= ....
31
Saturn

これは、質問が行われた時点では存在しなかった可能性がありますが、現在は RuntimeMaxSec というオプションがあり、指定された期間実行された後にサービスを終了します。 。

例えば.

[Service]
Restart=always
RuntimeMaxSec=604800

私には、これは悪用Type=notifyおよびWatchdogSec

49
Alex Forbes

私は解決策を見ました ここ それは少し回り道ならエレガントに見えました。重要なアイデアは、タイマーをトリガーとしてワンショットサービスを作成し、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のタイマーを活用できます。

29
matmat

のようなcrontabはどうですか

30 3 * * Sun /bin/systemctl restart yourService

毎週日曜日の午前3時30分にサービスyourServiceが再起動されます。

13
Fritz Zaucker

最終的に同じ目標を達成するためのいくつかの代替アプローチ:

  • サービスの実装を制御できる場合は、しばらくしてから自発的に終了させることができます。たとえば、一定回数の反復後(該当する場合)終了するか、SIGTERM/SIGKILLを送信するハンドラーでタイムアウトタイマーを使用します。
  • 自発的なサービス終了が実行可能でない/実用的でない場合、小さなcronベースのスクリプトがサービスプロセスを殺す可能性があります。
3
Dan Cornilescu

にコメントしたかった

[Service]
Restart=always
RuntimeMaxSec=604800

上記に答えてくださいが、それ以上のポイントはありません。

コメントは、このソリューションがOnFailure=failure_handling.serviceで設定された障害処理を呼び出すということです。スケジュールされた再起動は実際の障害ではないため、障害処理サービスからのロギングや通知などは不要であり、おそらく混乱を招くでしょう。

実際の定期的な再起動はsystemdにとって賢明な機能ですが、息を止めません。

2
E Gow