通常は実行したいデバイスがありますが、手動でシャットダウンして自動的に再起動したい場合があります。だから再起動するタイマーがありますOnCalendar=daily
。この方法は機能しますが、タイマーがデバイスをすぐに再起動するため、デバイスを2回停止する必要がある場合があります。
以下は、日数ではなく分だけを使用する簡単な例です。
[Unit]
Description=foo timer
[Timer]
Persistent=false
OnCalendar=minutely
AccuracySec=1
Unit=foo.service
[Install]
WantedBy=default.target
[Unit]
Description=foo service
[Service]
Type=simple
ExecStart=/bin/sh -c 'while true; do sleep 1; done'
[Install]
WantedBy=default.target
Isystemctl stop foo.service
とタイマーが1分前(1m以上systemdctl list-timers
)トリガーされた場合は、すぐに再トリガーしてデバイスを起動します。 2回停止すると、デバイスは次の瞬間まで常に停止したままになります。ドキュメントではPersistent=false
これが起こるように聞こえませんが、明らかに私が誤解しているようです。重要であれば、私が本当に興味を持っている毎日の単位はシステム単位ですが、テスト単位はユーザー単位です。
答え1
Persistent=false
(つまり、デフォルト)シャットダウン中に欠落しているタイマーをキャプチャする機能を無効にしたままにします。あなたの場合、システムはオンラインであり、タイマーは省略されています。OnCalendar
期間が経過した場合(おそらくfoo.serviceがすでに実行されているため)、まだ「1分/日」が実行される瞬間を待ちます。最後の実行以降" - いいえ最後の試行/確認/実行試行後、これは正確に意味します。foo.service 停止直後。
これは見積の結果ですman systemd.timer
。タイマーがシャットダウンしたときにアクティブにするデバイスがすでにアクティブになっている場合、デバイスは再起動せずに実行を続けます。。現在、タイマーが経過してもサービスが実行され続けているため、ジョブをスキップした場合、タイマーをリセットする直接的な方法はありません。
間接的な方法は自己再起動タイマー、類似 foo-try_restart.service
新しく作成されたものとは異なるsystemctl restart foo-try_restart.timer
以前に電話しましたsystemctl start foo.service
ため、(含まれていない)常に実行されるため、サイクルごとにタイマーがリセットされます。foo.service
foo-try_restart.service
Type=oneshot
RemainAfterExit
foo-try_restart.timer