Como o timer do systemd funciona?
Eu tenho myscript.servicee quero que este serviço comece a cada hora. Então eu escrevimyscript.timer
Description=My script timer
[Timer]
OnCalendar=hourly
;OnCalendar=*-*-* 0/2:00:00
[Install]
WantedBy=timers.target
Eu comecei systemctl enable --now myscript.timer, então systemctl status myscript.timere eu tenho
[user@localhost ~]$ sudo systemctl status myscript.timer
● myscript.timer - My script timer
Loaded: loaded (/etc/systemd/system/myscript.timer; enabled; vendor preset: disabled)
Active: active (waiting) since Tue 2020-09-01 12:10:54 +05; 4s ago
Trigger: Tue 2020-09-01 16:31:29 +05; 4h 20min left
Triggers: ● myscript.service
Sep 01 12:10:54 localhost.localdomain systemd[1]: Started My script timer.
E não consigo entender por que não dispara em uma hora?
Respostas
Infelizmente, não estou reproduzindo o problema que você está vendo. A julgar pelo comentado ;OnCalendar=, você está mudando de campo. Tem certeza de que usou systemctl daemon-reloadentre a edição e o início do cronômetro?
Quando eu testo em meu sistema, vejo:
$ systemctl --user cat mytime.timer # /home/stew/.config/systemd/user/mytime.timer [Unit] Description=Test timer [Timer] OnCalendar=hourly $ systemctl --user start mytime.timer
$ systemctl --user status mytime.timer
● mytime.timer - Test timer
Loaded: loaded (/home/stew/.config/systemd/user/mytime.timer; static)
Active: active (waiting) since Tue 2020-09-01 09:49:14 CEST; 7s ago
Trigger: Tue 2020-09-01 10:00:00 CEST; 10min left
Triggers: ● mytime.service
Sep 01 09:49:14 stewbian systemd[1691]: Started Test timer.
Então esperei 10m para o primeiro cronômetro expirar e obtive:
$ journalctl --user -u mytime.timer -u mytime.service
-- Logs begin at Mon 2020-07-06 04:41:08 CEST, end at Tue 2020-09-01 10:00:00 CEST. --
Sep 01 09:49:14 stewbian systemd[1691]: Started Test timer.
Sep 01 10:00:00 stewbian systemd[1691]: Starting mytime.service...
Sep 01 10:00:00 stewbian systemd[1691]: mytime.service: Succeeded.
Sep 01 10:00:00 stewbian systemd[1691]: Finished mytime.service.
$ systemctl --user status mytime.timer
● mytime.timer - Test timer
Loaded: loaded (/home/stew/.config/systemd/user/mytime.timer; static)
Active: active (waiting) since Tue 2020-09-01 09:49:14 CEST; 10min ago
Trigger: Tue 2020-09-01 11:00:00 CEST; 59min left
Triggers: ● mytime.service
Sep 01 09:49:14 stewbian systemd[1691]: Started Test timer.
Neste caso, eu usei OnCalendar=hourly. O primeiro gatilho foi no início da próxima hora. O segundo gatilho é definido para o início da hora seguinte.
Como suspeito que o problema seja um daemon-reload, tentei reproduzir o seu problema alterando OnCalendar=. Eu encontrei:
- Se eu usar,
systemctl daemon-reloada mudança é aplicada - Se eu
systemctl stop, em seguidasystemctl start, a alteração é aplicada, mesmo sem umdaemon-reload. - Se eu
systemctl startnão interromper o cronômetro anterior, a alteração não é aplicada e recebo um aviso sobre isso:
$ systemctl --user start mytime.timer
Warning: The unit file, source configuration file or drop-ins of mytime.timer
changed on disk. Run 'systemctl --user daemon-reload' to reload units.