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 se nastavuje v rámci direktivy [Timer]
a to buď navázáním na určitou akci, která odstartuje časový interval, po jehož uplynutí se zavolá služba nastavená parametrem Unity=
. Nebo navázáním na skutečný čas.
Časový interval – monotonic
Se nastavuje tam, kde má něco fungovat jen po určitou dobu. Nebo se naopak po určité době něco zapnout. Délku časového intervalu 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
A to prostřednictvím následujících parametrů:
- OnActiveSec
--on-active=
– 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
--on-startup=
– 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 má tenhle parametr stejný výsledek jakoOnActiveSec
.- OnUnitActiveSec
--on-unit-active=
– hlídá čas, který uplynul od okamžiku kdy došlo je spuštění služby (service) hlídané časovačem.- OnUnitInactiveSec
--on-unit-inactive=
– hlídá čas, který uplynul od okamžiku kdy došlo k vypnutí služby (service) hlídané prostřednictvím časovače.
Reálný čas
- OnCalendar
--on-calendar=
umožňuje načasovat konkrétní čas
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
Příklad
Následující příklad je konkrétní řešení automatického rebootu disklessového stroje lab-dc. Načasovaná unita /srv/1022/nvidia_gpu/etc/systemd/system/sched-reboot.timer
je umístěná do vrstvy, která je určená výlučně pro tento stroj, který má na hostitelském stroji patty dedikovanou GPU kartu. Její obsah je následující:
[Unit] Description=Načasovaný restart [Timer] OnCalendar=Tue *-04..07-* 13:30:00 Unit=sched-reboot.service [Install] WantedBy=timers.targe
A když nastane správný okamžik, spouští unitu /srv/1022/nvidia_gpu/etc/systemd/system/sched-reboot.service
, která udělá korektní restart.
[Unit] Description=Restart lab-dc každé úterý ve 13:30 [Service] Type=simple ExecStart=systemctl reboot --no-block [Install] WantedBy=default.target
Případnou změnu načasování ve potřeba řešit nikoliv v prostředí stroje lab-dc, ale vždy v rámci vrstvy /srv/1022/nvidia_gpu , jinak by po restartu zůstalo vše při starém.
|
Odkazy
- https://wiki.archlinux.org/title/systemd/Timers
- https://documentation.suse.com/smart/systems-management/html/systemd-working-with-timers/index.html
- https://www.freedesktop.org/software/systemd/man/latest/systemd.timer.html
- https://discussion.fedoraproject.org/t/how-to-write-a-systemd-service-to-reboot-a-server/69341/6