Come funziona il timer di systemd?

Sep 01 2020

Ho myscript.servicee desidero che questo servizio inizi ogni ora. Così ho scrittomyscript.timer

Description=My script timer

[Timer]
OnCalendar=hourly
;OnCalendar=*-*-* 0/2:00:00

[Install]
WantedBy=timers.target

Ho iniziato systemctl enable --now myscript.timer, poi systemctl status myscript.timerE ho ottenuto

[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 non riesco a capire perché non si attiva tra un'ora?

Risposte

1 Stewart Sep 01 2020 at 15:03

Sfortunatamente, non riproduco il problema che stai riscontrando. A giudicare dal commento ;OnCalendar=, hai cambiato campo. Sei sicuro di aver utilizzato systemctl daemon-reloadtra la modifica e l'avvio del timer?

Quando lo provo sul mio sistema vedo:

$ 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.

Quindi ho aspettato 10 m per la scadenza del primo timer e ho ottenuto:


$ 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.

In questo caso, ho usato OnCalendar=hourly. Il primo trigger è stato all'inizio dell'ora successiva. Il secondo trigger è impostato per l'inizio dell'ora successiva.


Poiché sospetto che il problema sia un daemon-reload, ho provato a riprodurre il tuo problema modificando OnCalendar=. Ho trovato:

  1. Se uso systemctl daemon-reloadla modifica viene applicata
  2. Se io systemctl stopallora systemctl start, la modifica viene applicata, anche senza daemon-reload.
  3. Se systemctl startsenza fermare il timer precedente, la modifica non viene applicata e ricevo un avviso in merito:
$ 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.