Systemd:WatchdogSecオプションを設定した後、サービスは再起動されません。

Systemd:WatchdogSecオプションを設定した後、サービスは再起動されません。

qemuを管理するためにsystemdを使用しようとしています。 qemu がクラッシュすると、自動的に再起動できます。次の単位ファイルがあります。

[Unit]
Description=vm manager
After=network.target
Before=shutdown.target reboot.target poweroff.target halt.target

[Service]
Type=forking
ExecStart=/root/vm/vm-manager.sh start-vm
ExecStop=/root/vm/vm-manager.sh stop-vm
KillSignal=SIGCONT
PIDFile=/root/vm/run/pid
WatchdogSec=30s
Restart=on-failure

[Install]
WantedBy=multi-user.target

アプリケーションは sd_notify(0, "WATCHDOG=1") を呼び出しませんが、30 秒後もサービスは「失敗」状態になりません。 2つの質問があります。

  1. このサービスは30秒後に再起動する必要があるようです。サービスを終了または停止するまで実行され続けるのはなぜですか?
  2. qemuを手動で終了すると(qemuプロセスがデフォルトプロセスに設定されている)、サービスは待たずにすぐに再起動されます。

上記の2つの質問に加えて、ユニットファイルにエラーや提案がある場合は自由に送信してください。

ありがとうございます!

ベストアンサー1

「デーモン」失敗と「サービス」失敗状態の間に違いがあります。

デーモンの失敗は、単にプログラムが終了コードとしてゼロを返す以外の方法で終了したことを意味します。これはRestart=on-failure、「失敗した場合はデーモンを再起動します」を意味します。また、他の条件でも再起動できます。下の表を参照してください。再開=これはまた、「失敗」が正確に何を意味するかを説明します。

あなたのサービスファイルによると、「サービス」失敗の定義はありません。デフォルトの定義は基本的に「デーモンが終了コードとしてゼロを返す以外の方法で終了しており、現在実行されていません」と思います。ただし、サービスファイルにデーモンプロセスを今すぐ再起動してください。その結果、「失敗」状態になりましたが、しばらくの間、ユーザーはこれに気付かなかった可能性があります。ログチェックを使用できますjournalctl -u foo.service

さらに、メインプロセスのPIDが30秒前と同じであることを確認する必要があります。 PIDが異なる場合、これはデーモンが呼び出されなかったため、systemdがデーモンを終了し、sd_notifyサービスファイルが失敗したときに再起動するように指示し、起動の間に再起動するように指示しないため、デーモンをすばやく再起動することを意味します。 (下記参照)。

サービスにエラー定義が含まれるようにするには、次のものを使用する必要があります。

StartLimitInterval=5min
StartLimitBurst=4

これらのオプションはよく文書化されています。ここただし、この例の両方のデフォルトの意味は、「デーモンを5分間隔で4回以下で開始します。起動後に失敗すると、その間隔で4回以下でデーモンを開始します。サービスが失敗したと見なされます」これが発生すると、デフォルト値StartLimitAction=はNoneに設定されます。

別の設定可能な値はですRestartSec=。 ~から文書:

サービスを再起動する前にスリープ時間を設定します(Restart =を使用して設定)。秒単位の単位なし値、または「5min>20s」などの時間範囲値を使用します。デフォルトは100ミリ秒です。

RestartSec=これは、デフォルトでは、systemdがデーモンを再起動する前に少なくとも待つ必要があることを意味します。

したがって、これらのオプションをすべて組み合わせることができますが、次の値を使用すると仮定します。

StartLimitInterval=5min
StartLimitBurst=4
RestartSec=2min

障害の定義は次のとおりであるため、サービスは障害状態に移行しません。

指定された5分間隔でサービスが開始されると、4回失敗します。

ただし、systemdは最後の失敗から2分以内にサービスを再起動しないため、サービスはStartLimitBurst到着しませんStartLimitInterval

おすすめ記事