Nastavení časovače systemd
Načasování realizace plánované akce je u každého systému klíčová záležitost, bez které nelze fungovat. U starších verzí unixových systémů hlídal správné načasování démon cron. U novějších verzí linuxových systémů, které používají systemd může být nahrazen službou timers.target, která hlídá čas, kdy se mají jím spravované unity spustit, zastavit, či restartovat.
Tak jako veškerá konfigurace systemd, i časování se nastavuje přes unity, které mají obvykle příponu .timer
, které pracují s direktivami [Timer]
kde se řeší načasování a [Install]
, přes kterou se nastavuje, kdy se časovač aktivuje.
Aktivace/Deaktivace unity pro načasování
Přehled aktuálně spuštěných časovačů lze získat
$ systemctl list-timers VZOREK
VZOREK, umožňuje odfiltrování z výstupu na základě názvu (resp. regulárního výrazu) unity které nás zajímají. Např. apt*
vypíše všechny unity aktuálně spuštěných časovačů, jejichž názvy začínají řetězcem "apt". Ovšem to dává smysl jen u většího počtu spuštěných časovačů.
Kompletní výpis všech časovačů, tj. včetně neaktivních, se udělá pokud se přidá před VZOREK ještě atribut --all
|
Systémové časovače mají uloženy svá časová razítka v adresáři s prefixem stamp-
v adresáři /var/lib/systemd/timers
Existující razítko znamená, že služba běží a čeká až nastane její čas.
Lze zakládat také časovací unity v rámci uživatelského účtu. Ty mají svá časová razítka uložená v adresáři v ~/.local/share/systemd/
|
Načasování
Načasování unity lze provést v rámci direktivy [Timer]
buď navázáním na určitou akci, resp. časový interval, jaký ní uplyne (monotonic). Nebo navázáním na skutečný čas (real-time)
Časový interval
Se nastavuje tam, kde má něco fungovat jen po určitou dobu. Nebo se naopak po určité době něco zapnout. Čas lze specifikovat s využitím následujících řetězců od mikrosekund po roky:
- usec
- msec
- seconds
- minutes
- hours
- days
- weeks
- months
- years
Prostřednictvím následujících parametrů:
- OnActiveSec
- Kontroluje, čas který uplynul od okamžiku, kdy došlo k aktivaci časovače
- OnBootSec
- Ohlídá čas který uplynul od okamžiku zavedení jádra systému
- OnStartupSec
- Je klíčový pro časovače, které se spouštějí v rámci uživatelsky spouštěných služeb. Pro systémové unity by měl tenhle parametr výsledek stejný efekt jako u
OnActiveSec
. - OnUnitActiveSec
- Hlídá čas, který uplynul od okamžiku kdy došlo je spuštění služby (service) hlídané časovačem.
- OnUnitInactiveSec
- Hlídá čas, který uplynul od okamžiku kdy došlo k vypnutí služby (service) hlídané prostřednictvím časovače.
V rámci spuštěné session lze využít k časování systemd-run
https://documentation.suse.com/smart/systems-management/html/systemd-working-with-timers/index.html
Reálný čas
Naopak parametr OnCalendar=
umožňuje načasovat opakované spuštění.
Zpracovává dva až čtyři řetězce. Přes první (volitelný) lze nastavit den týdnu – podobně jako cronu, je akceptována zkratka anglického názvu dne Mon
, Tue
, atp. Jednotlivé dny jsou odděleny čárkou a lze nastavity i rozsah, pomocí dvou teček, podobně jakou u bashe.
Parametr může mít více instancí, pokud má mít časovač v různých dnech jiný čas spuštění. Např.:
OnCalendar=Mon..Fri 22:30 OnCalendar=Sat,Sun 20:00
Druhý, rovněž volitelný řetězec lze nastavit konkrétní den v měsíci, resp. roce. V případě, že to pro časovač není důležité, uveden být nemusí.
Třetím řetězcem je nastavení konkrétního času, za kterým může ještě následovat příslušná časová zóna (čtvrtý řetězec).
Pro to, jak má vypadat řetězec příslušné zóny viz timedatectl list-timezones
Před uložením lze zkontrolovat nastavení na příkazovém řádku následujícím způsobem:
~# systemd-analyze calendar "Tue *-04..07-* 13:30:00 Europe/Prague" Normalized form: Tue *-04..07-* 13:30:00 Europe/Prague Next elapse: Tue 2024-04-16 13:30:00 CEST (in UTC): Tue 2024-04-16 11:30:00 UTC From now: 57min left
V tomto případě dojde ke spuštění akce každé úterý, od dubna do července, vždy ve 13:30 s tím že k prvnímu spuštění dojde za 57 minut od okamžiku testu
Nastavení
Příklad
/srv/1022/nvidia_gpu/etc/systemd/system/sched-reboot.timer
[Unit] Description=Načasovaný restart [Timer] OnCalendar=Tue *-04..07-* 13:30:00 Unit=sched-reboot.service [Install] WantedBy=timers.targe
/srv/1022/nvidia_gpu/etc/systemd/system/sched-reboot.service
[Unit] Description=Restart lab-dc každé úterý ve 13:30
[Service] Type=simple ExecStart=systemctl reboot --no-block
[Install] WantedBy=default.target
unitu s příponou .service