Nastavení časovače systemd

Z DCEwiki
Skočit na navigaci Skočit na vyhledávání

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čů.

Poznámka 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.

Poznámka 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 jako OnActiveSec.
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.
Poznámka Pro jednorázové nastavení časovače, validní v rámci aktuálně spuštěné session, lze použít systemd-run. Spouštět lze nejenom konkrétní unitu, ale i spustitelný skript, kterému lze předat další parametry. Takhle by kupříkladu vypadalo jednorázové spuštění shellového skriptu /usr/local/bin/helloworld.sh s dvouhodinovým zpožděním a předaným parametrem --language
systemd-run --on-active="2hours" /usr/local/bin/helloworld.sh --language=pt_BR

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
Upozornění 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