私は週に一度遅くてバグのあるワンタイムプログラムを実行するサービスを持っていますが、時々明確な理由なく中断されることがあります。サービスが4時間以上実行されている場合は、サービスを再起動したいと思います。 4時間後に再起動するように設定してみました(次の単位定義で実行を続けている場合)。
[Unit]
Description=Some buggy software
[Service]
WorkingDirectory=/home/buggy
ExecStart=/home/buggy/run
Environment=NODE_VERSION=14
Restart=on-failure
RestartSec=4 h
StartLimitBurst=4
StartLimitInterval=1 s
タイマーもあります:
[Unit]
Description=Some buggy software schedule timer
[Timer]
Unit=buggy.service
OnCalendar=Sat *-*-* 22:00:00
[Install]
WantedBy=timers.target
しかし、まだ無期限の静止状態です。 2日間実行した後、サービスを確認しましたが、まだ静止しています。
私は何が間違っていましたか? systemdを使用して必要なタスクを実行する方法はありますか?
答え1
RuntimeMaxSec ディレクティブを使用します。欠陥のあるプログラムを修正する必要があるため、Watchdogは使用できません。
RuntimeMaxSec=
サービスが実行される最大時間を設定します。この機能を使用し、指定された時間より長くサービスがアクティブになると、サービスは終了してエラー状態になります。
Type=oneshot
サービスは有効化が完了するとすぐに終了するため、この設定はサービスには影響しません。infinity
ランタイム制限を設定したくない場合は、パススルー(デフォルト)です。
Type=notify
/がサービスType=notify-reload
によって送信されると、EXTEND_TIMEOUT_USEC=...
ランタイムが延長される可能性がありますRuntimeMaxSec=
。このメッセージの最初の受信は、RuntimeMaxSec=
ランタイムを超える前に発生する必要があります。ランタイムを超えると、サービス管理者は、サービスが終了するまで指定された間隔でサービスが繰り返されると、サービスを実行しRuntimeMaxSec=
続けることができます。 (または終了中)。 (望むより)。EXTEND_TIMEOUT_USEC=...
STOPPING=1
sd_notify(3)