systemdタイマー:特定の時間範囲内でのみサービスを有効にします。

systemdタイマー:特定の時間範囲内でのみサービスを有効にします。

デスクトップで12時から13時の間にプログラムがアクティブになりたいとします(つまり、PCがいつでもオンになるという保証はありません)。私はこれにsystemdユニットを使用できると仮定します。

Aタイマーを使用してサービスを開始し、ダウンタイムを計算するのは簡単です。

A.タイマー

[Timer]
Unit=A
OnCalendar=*-*-* 12:00:00
Persistent=true

A以下のような競合するサービスにより停止することがあります。以前に提案された

サービス(紛争):

#add conflict to A.service
[Unit]
Description=This is A.service
Conflicts=killA.service
#make sure killA considers A to be active
RemainAfterExit=yes

サービスAを殺す:

 [Unit]
 Description=kills A
 [Service]
 Type=oneshot
 ExecStart=/bin/true
 #kill only if A is running:
 Requires=A.service

タイマー終了

[Timer]
Unit=killA
OnCalendar=*-*-* 13:00:00
Persistent=true

今、いくつかの可能なシナリオがあります。

  • 11:00から14:00までの電源投入:期待どおりに開始と停止
  • 11時から12時30分までの電源投入:期待どおりに起動しますが、絶対に停止しません - >次に電源が供給されるとどうなりますか?

    • 12:45:Aが始まりますか? (24時間以内に最後に実行されました)
    • 14時間:Aをアクティブにしてはいけないので、killAを実行してはいけません。
    • 翌日12時15分? (最後のブートが24時間もかかりませんでしたが、KillAブートがありません。)
    • 翌日12時45分? (24時間前に最後に開始しましたが、killAは24時間未満前に開始されました。killAによって停止されますか?)
  • 12:30~14h 電源投入:期待どおりの起動と停止(A.timerの永続性により)

  • 電源投入14時間:耐久性によりAが始まります。 killAは依存関係のためにすぐに無効になりますか?そもそもAを始めることは避けられますか?

簡単に言うと:

システムタイマーを使用して、シャットダウン/開始に関係なく、サービスを指定された間隔内で有効にし、間隔の外で無効にするにはどうすればよいですか?


実際のユースケースの例:ssh営業時間にのみアクセスを許可します。

PS:まだシステムタイマーについてはよくわからないようです。

答え1

私は同じ要件を持っています。

両方のタイマーが開始に追いつくと、競合状態が発生し、ランダムな結果が生成されることを確認できます。

それでは、システムの再起動シナリオはどうですか?1回以上12時から13時まで。Persistentおそらくこの場合は役に立ちません。

私の結論は(しかし間違っていることが証明されることを願っています)、systemdはこのユースケースには適していないということです。

私の回避策は、フラグなしで上記の設定を使用することでしたPersistent。次に、idle起動後の状態を処理するために特別に新しいサービスを作成します。サービスは、現在の時間と現在のターゲットサービスの状態を比較し、矛盾した場合にサービスを開始/停止します。開始/停止時間は、タイマーと「Start Manager」サービススクリプトで繰り返される必要がありますが、これは理想的ではありません。

これが何度も再起動しても、選択した期間にサービスが実行されることを保証する唯一の信頼できる方法です。

関連情報