デスクトップで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」サービススクリプトで繰り返される必要がありますが、これは理想的ではありません。
これが何度も再起動しても、選択した期間にサービスが実行されることを保証する唯一の信頼できる方法です。