ここで、少し回り道をしたとしても、エレガントに見える解決策を見ました。重要なアイデアは、別のを再起動するタイマーによってトリガーされるワンショット サービスを作成することです。 サービス。
タイマーの場合:
[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 のタイマーを活用できます。
systemd バージョン>=229 の場合、RuntimeMaxSec
というオプションがあります。 、指定された期間実行された後にサービスを終了します。
例えば7 日ごとに再起動するには:
[Service]
Restart=always
RuntimeMaxSec=7d
私には、これは Type=notify
を悪用するよりもエレガントに思えます と WatchdogSec
.
systemd は、ベンダーが提供する systemd ユニット ファイルにディレクティブを追加および上書きするクリーンな方法を提供します。ドロップイン ユニットは man systemd.unit で説明されています。たとえば、パッケージによって提供される foo サービスを定期的に再起動する場合は、/etc/systemd/system/foo.service.d/periodic-restart.conf
という名前のファイルを作成します。 .内容は上図の通りとなります。次に:
systemctl daemon-reload
systemctl restart foo
ステータス出力で報告されるため、ドロップイン ユニットがロードされたことを確認できます。
systemctl status
最後に、systemctl show
を検索して、ディレクティブが含まれていることを確認できます。 出力:
systemctl show foo.service | grep RuntimeMax
systemctl show
によって報告されたディレクティブ "RuntimeMaxUSec`