C'è un modo per sapere quando verrà eseguito il prossimo timer di sistema?


19

Sto testando un timer di sistema e sto cercando di ignorare il timeout predefinito, ma senza successo. Mi chiedo se c'è un modo per chiedere a systemd di dirci quando verrà eseguito il servizio.

File normale ( /lib/systemd/system/snapbackend.timer):

# Documentation available at:
# https://www.freedesktop.org/software/systemd/man/systemd.timer.html

[Unit]
Description=Run the snapbackend service once every 5 minutes.

[Timer]
# You must have an OnBootSec (or OnStartupSec) otherwise it does not auto-start
OnBootSec=5min
OnUnitActiveSec=5min
# The default accuracy is 1 minute. I'm not too sure that either way
# will affect us. I am thinking that since our computers will be
# permanently running, it probably won't be that inaccurate anyway.
# See also:
# http://stackoverflow.com/questions/39176514/is-it-correct-that-systemd-timer-accuracysec-parameter-make-the-ticks-slip
#AccuracySec=1

[Install]
WantedBy=timers.target

# vim: syntax=dosini

Il file override ( /etc/systemd/system/snapbackend.timer.d/override.conf):

# This file was auto-generated by snapmanager.cgi
# Feel free to do additional modifications here as
# snapmanager.cgi will be aware of them as expected.
[Timer]
OnUnitActiveSec=30min

Ho eseguito i seguenti comandi e il timer continua a spuntare ogni 5 minuti. Potrebbe esserci un bug in systemd?

sudo systemctl stop snapbackend.timer
sudo systemctl daemon-reload
sudo systemctl start snapbackend.timer

Quindi mi chiedevo anche, come posso sapere quando il timer ticchetterà dopo? Perché questo mi direbbe immediatamente se è tra 5 minuti. o 30 min. ma dal systemctl status snapbackend.timernon dice nulla al riguardo. Mi chiedo solo se esiste un comando che mi dica il ritardo attualmente utilizzato.

Per chi è interessato, c'è anche il file di servizio ( /lib/systemd/system/snapbackend.service), anche se immagino che ciò non dovrebbe avere alcun effetto sui tick del timer ...

# Documentation available at:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html

[Unit]
Description=Snap! Websites snapbackend CRON daemon
After=snapbase.service snapcommunicator.service snapfirewall.service snaplock.service snapdbproxy.service

[Service]
# See also the snapbackend.timer file
Type=simple
WorkingDirectory=~
ProtectHome=true
NoNewPrivileges=true
ExecStart=/usr/bin/snapbackend
ExecStop=/usr/bin/snapstop --timeout 300 $MAINPID
User=snapwebsites
Group=snapwebsites
# No auto-restart, we use the timer to start once in a while
# We also want to make systemd think that exit(1) is fine
SuccessExitStatus=1
Nice=5
LimitNPROC=1000
# For developers and administrators to get console output
#StandardOutput=tty
#StandardError=tty
#TTYPath=/dev/console
# Enter a size to get a core dump in case of a crash
#LimitCORE=10G

[Install]
WantedBy=multi-user.target

# vim: syntax=dosini

1
L'output di systemctl list-timersaiuto?
phg,

Ah! Cercando su questo, ho trovato questa pagina con la soluzione: bbs.archlinux.org/viewtopic.php?id=214989 Ora scrivo una risposta.
Alexis Wilke,

Risposte:


25

Lo stato dei timer attualmente attivi può essere mostrato usando systemctl list-timers:

$ systemctl list-timers --all
NEXT                         LEFT     LAST                         PASSED       UNIT                         ACTIVATES
Wed 2016-12-14 08:06:15 CET  21h left Tue 2016-12-13 08:06:15 CET  2h 18min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

1 timers listed.

7

Dal commento e dalla risposta di @phg, ho trovato una pagina con la risposta. I timer sono cumulativi e devi prima ripristinarli, altrimenti la voce precedente rimane. Questo è utile per i calendari, ma funziona allo stesso modo con tutti i timer.

Avere una voce che reimposta il timer prima di cambiarlo in un nuovo valore funziona come previsto:

# This file was auto-generated by snapmanager.cgi
# Feel free to do additional modifications here as
# snapmanager.cgi will be aware of them as expected.
[Timer]
OnUnitActiveSec=
OnUnitActiveSec=30min

1

No, non appare un modo per vedere esattamente quando verrà eseguito il prossimo timer. systemdofferte systemctl list-timerse systemctl status something.timer, ma quelle non mostrano l'effetto diAccuracySec= e forse altre direttive che spostano il tempo.

Se si imposta AccuracySec=1hsu due server, entrambi segnaleranno che lo stesso timer su entrambi i server si attiverà contemporaneamente, ma in realtà potrebbero avviarsi a un'ora di distanza! Se sei interessato a sapere se due timer randomizzati potrebbero scontrarsi, non sembra esserci modo di controllare il tempo di esecuzione calcolato finale per scoprirlo.

Esiste un problema di systemd aperto per rendere più preciso / meno confuso l'output dei timer elenco.


Punto interessante sui timer. Le informazioni che riceviamo list-timers, tuttavia, sono già abbastanza buone da capire se il tuo utilizzo dei timer è corretto o meno.
Alexis Wilke,

1
Non nel mio caso. Vorrei usare la stessa identica configurazione su host gemelli, ma uso AccuracySec = per garantire che entrambi non eseguano la manutenzione contemporaneamente. Vorrei vedere quando i timer verranno effettivamente attivati ​​su ciascun host, ma non posso.
Mark Stosberg,

Ah. Ho problemi simili. Vorrei usare un master selezionato (usando un sistema di voto) e il master invia un messaggio "fai manutenzione" al computer 1, una volta che il computer 1 è finito, segnala il suo nuovo stato al master che quindi chiede al computer 2 di fare la sua manutenzione, ecc. Uno di questi computer sarebbe ovviamente il master, ma il codice che esegue il ciclo di manutenzione dovrebbe essere separato dalla manutenzione effettiva. Un problema da tenere a mente. Se il tuo cluster deve crescere un po ', ricorda che ci vuole tempo e potrebbe essere così lungo che alcuni computer non vengono aggiornati per molto tempo!
Alexis Wilke,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.