毎時間スクリプトを実行するタイマーを使用してシステムサービスを作成しましたが、そうではありません。
% cat /etc/systemd/system/myservice.service
[Unit]
Description=Run script after network established
Requires=network-online.target
After=network-online.target
[Service]
Type=simple
RemainAfterExit=yes
ExecStart="/srv/script"
[Install]
WantedBy=multi-user.target
% cat /etc/systemd/system/myservice.timer
[Unit]
Description=Run script every hour
[Timer]
OnBootSec=15min
OnUnitActiveSec=1h
[Install]
WantedBy=timers.target
ネットワークの設定後にスクリプトを実行しますが、それ以降は毎時間実行されません。
sudo systemctl status myservice.{service,timer}
...両方とactive
イムを示していますenabled
。
時間ファイルがサービスファイルを参照するようにするにはどうすればよいですか?
追加情報:
% systemctl list-timers --system --all
NEXT LEFT LAST PASSED UNIT ACTIVATES
~~~~~~~~~~~~~~~~
Sun 2023-09-24 03:10:54 BST 3 days left Sun 2023-09-17 03:10:50 BST 3 days ago e2scrub_all.timer e2scrub_all.service
- - - - fstrim.timer fstrim.service
- - Wed 2023-09-20 17:28:10 BST 2h 27min ago myservice.timer myservice.service
答え1
man systemd.timer
説明する:
タイマーの有効期限が切れたときにアクティブにするデバイスがすでにアクティブになっている場合、デバイスは再起動せずに実行を続けます。この場合、新しいサービスインスタンスを作成するという概念はありません。したがって、
RemainAfterExit=
セットを持つサービス(サービスの基本プロセスが終了した後も持続します)は、通常、繰り返しタイマーによるアクティブ化には適していません。なぜなら、サービスは一度だけアクティブになり、永遠に続くからです。
これにより、操作が完了した後もRemainAfterExit=yes
サービスはアクティブのままになります。サービスが有効になっているため、タイマーは他のインスタンスを作成しません。active
/srv/script
答えはおそらく削除ですRemainAfterExit=yes
。タイマーにジョブを実行させるには、少なくともサービスが停止していることを確認する必要があります。