システム単位のファイルがあり、次のパラメータを指定して失敗した場合に再起動できることを知っています。
Restart=always
RestartSec=90
失敗するたびに90秒後に再起動します。
ただし、システム時間が特定の時間範囲(たとえば、08:00~17:00)の間にある場合にのみ、再起動して再起動するだけです。
systemdでこれを行う方法はありますか?
答え1
サービス単位ファイルに直接設定:いいえ。
Heath Robinsonメカニズムの使用:はい、以下です。
- どこかに2つのクリップファイルを作成し、
wibble-in-hours.conf
この設定をオンにしてwibble-out-of-hours.conf
この設定をオフにします。章のタイトルを忘れないでください。 - どの時点でも、
/etc/systemd/system/wibble.service.d/restart.conf
これはこれらのファイルの1つです。 systemdマニュアル(qv)では、組み込みディレクトリとフラグメントファイルについて説明します。 - uschedule ジョブ、cron ジョブ、またはフラグメント ファイルの交換を希望するその他のメカニズムを設定し、適切な時間に呼び出し、
systemctl daemon-reload
営業時間外の時間にサービスが終了したら、サービスを開始します。 (サービスのブロック、無効化、および一部のオペレーティングシステムがパッケージのアップグレード中にサービスを一時的に停止することに注意してください。これらすべてがサービスを開始するかどうかをテストすることが重要です。)
答え2
再起動間隔ではないことを受け入れることができる場合正確に90秒で毎回同じではありません。これにより、サービスデバイス+対応するタイマーデバイスを使用して簡単な方法でこれを達成できます。
タイマーデバイスに時間範囲を指定させてください。OnCalendar=
環境。
たとえば、08:00から16:59まで1分ごとに実行する場合(通常00秒で実行されますが、システムに5秒の空き時間を与えて予約):
[Timer]
OnCalendar=*-*-* 08-16:*:00
AccuracySec=5s
また、サービスユニットに含めてくださいRestart=no
(またはデフォルトRestart=
なので省略)。no
この構成では、systemd はその時間範囲内で毎分デバイスを起動しようとします。ただし、デバイスがすでに実行されている場合は、起動しようとしても何も起こりません。
一方、デバイスが停止してタイマーが起動すると(その時間に1分に1回)、デバイスは実際に「再起動」されます。
正味の効果は、タイマーが停止後0秒から65秒の間にデバイスを再起動させることです(マージン5秒の計算)。ただし、その時間範囲内でのみ可能です(タイマーはその時間中のみ機能するため)。
ゼロを下限値として使用することが許可されていない場合(デバイスが停止してから再起動されるまでに少なくとも30秒が必要であると仮定)、ExecStopPost=/bin/sleep 30
サービスユニットに追加して解決策を使用できます。これにより、基本サービスが停止した後もデバイスが効果的に「停止」するのに30秒が必要になり、その30秒が経過した後にのみタイマーデバイスで再起動できます。事実上、これは停止後30〜95秒以内に再開されます。
バラよりsystemd.timeのマニュアルページOnCalendar=
再起動ポリシーの特定の時間要件に合わせて間隔を調整できるように間隔を指定する方法の詳細。
答え3
アドバイスや時間をいただきありがとうございます。私はsystemdサービスを通してこれを達成しました。
Restart=always
@JdeBPが提案した2つのcrontabエントリ
- 08:00に開始
- 他の人は17:00に停止します。