システムタイマーは、persist = falseの場合でもサイクルごとに複数回実行されます。

システムタイマーは、persist = falseの場合でもサイクルごとに複数回実行されます。

通常は実行したいデバイスがありますが、手動でシャットダウンして自動的に再起動したい場合があります。だから再起動するタイマーがあります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.servicefoo-try_restart.serviceType=oneshotRemainAfterExitfoo-try_restart.timer

関連情報