Persistent=false
私の目標は定期的に実行することですが、起動後すぐに実行されるリアルタイムタイマーがあります!
私はこれが非常に一般的な質問だと思いましたが、StackExchangeで見つかった答えのどれも私の問題を解決できませんでした。私はそのアドバイスに従った。この投稿そしてこの投稿。
ここでは、私の問題を再現するための簡単な例を報告します。タイマーは5分(0、5、10、15、... 55)ごとに実行されますが、起動した後は実行されないようにします。
sudo systemctl edit --force --full test.service
使用して生成する次の 2 つのファイルがあります。
sudo systemctl edit --force --full test.timer
# test.service
[Unit]
Description=test
[Service]
Type=simple
ExecStart=echo "TEST"
# test.timer
[Unit]
Description=test
[Timer]
OnCalendar=*:0/5
Persistent=false
[Install]
WantedBy=default.target
次に、次のコマンドを使用してサービスを無効にし、
sudo systemctl disable test.service
次のコマンドを使用してタイマーを有効にしました。
sudo systemctl enable test.timer
これでsudo restartが実行されるとtest.service
すぐに実行されます。
journalctl -u test
良い:
-- Journal begins at Thu 2023-08-24 02:39:59 UTC, ends at Thu 2023-08-24 19:40:14 UTC. --
Aug 24 19:33:02 rbpi0 systemd[1]: Started test.
Aug 24 19:33:02 rbpi0 echo[463]: TEST
Aug 24 19:33:03 rbpi0 systemd[1]: test.service: Succeeded.
Aug 24 19:35:14 rbpi0 systemd[1]: Started test.
Aug 24 19:35:14 rbpi0 echo[911]: TEST
Aug 24 19:35:14 rbpi0 systemd[1]: test.service: Succeeded.
Aug 24 19:40:14 rbpi0 systemd[1]: Started test.
Aug 24 19:40:14 rbpi0 echo[1352]: TEST
Aug 24 19:40:14 rbpi0 systemd[1]: test.service: Succeeded.
起動test.service
時に実行されたことをはっきりと見ることができます。19:33
エラーがどこにあるかを知っている人はいますか?
編集1
この部分を変更してみました[Install]
。
- 試み1:
[Install]
セクションを完全に削除します。
結果:
The unit files have no installation config (WantedBy=, RequiredBy=, Also=,
Alias= settings in the [Install] section, and DefaultInstance= for template units).
This means they are not meant to be enabled using systemctl.
- 試み2:変更
WantedBy=default.target
またはWantedBy=timer.target
結果WantedBy=multi-user.target
:同じ問題です。
編集2
読書としてタイマーマニュアルページ私はシステムクロックが以前に同期されていることを確認する必要があることがわかりましたtime-sync.target
。時計が同期していることを確認しましたが、問題は解決しません。
答え1
タイマーユニットは
WantedBy=timer.target
適切な[Install]
セクションになければなりません。開始順序の特定のポイントから開始するには、タイマーおよび/またはサービスデバイスにおよび/
Before=
またはなどの指示を追加する必要があります。After=
[Unit]
この文脈では、「リアルタイム」と「周期的」の違いが何を意味するのかわかりません。なぜなら、タイマーユニットが実際に
OnCalendar=
「周期的」にするすべてであるからです。*:0/5
5分ごとにアクティブになることを示し、特定の開始時間がないため、開始後できるだけ早く開始されます。出力を参照してください。systemd-analyze calendar --iterations=10 '*:0/5'
答え2
ユーレカ!
問題は、時間を正しく初期化しないことです。
うん、気にしてこの投稿/sbin/hwclock --hctosys --utc --noadjfile
しかし、時間を遅らせるコマンドを含むスクリプトを使用しました。これにより、起動順序がすでに開始され、エントリOnCalendar=
(例:タイマーマニュアルページ)。
次のサービスを追加するだけで十分です。これ、他のものを変更する必要はありません。