Przejdź do treści

Systemd timer - przykłady

Opcje konfiguracji timerów

Jako dodatek do poprzedniego artykułu opisującego timery w systemd, poniżej przedstawiam kilka możliwości konfiguracyjnych. W sekcji [Timer] dostępne są opcje definiujące harmonogram:

OnCalendar

Harmonogram kalendarzowy (data i godzina). Składnia to np. DayOfWeek Year-Month-Day Hour:Minute:Second.

Można używać symboli wieloznacznych *, zakresów (Mon..Fri), list (np. Mon,Wed,Fri) czy specjalnych zwrotów (@daily, @hourly itd., np. OnCalendar=*-*-* 00:00:00 dla codziennie o północy). Ta opcja pozwala ustawić dowolną datę lub godzinę.

Przykład:

- `OnCalendar=Mon..Sun *-*-* 05:00:00`  5:00 każdego dnia tygodnia.
- `OnCalendar=Fri *-*-* 18:00:00`  piątek o 18:00.

Protip

Można dodać wiele wpisów `[Timer]` w jednym pliku dla różnych terminów (np. inne czasy w dni robocze i weekendy).
Składnię testujemy poleceniem `systemd-analyze calendar "<wyrażenie>"`, które pokaże kolejne wystąpienia.

OnBootSec

Czas (np. 5min, 1h, 30s) po starcie systemu. Timer wyzwala usługę określoną liczbę czasu od uruchomienia systemu. Odpowiada to konstrukcji @reboot z crona (w przykładzie migracji cron na timer, @rebootOnBootSec=1s).


OnStartupSec

Czas po uruchomieniu menedżera usług systemd. Dla usług systemowych zwykle jest to prawie to samo co OnBootSec. Bywa przydatne w usługach użytkownika (user services), które startują dopiero przy logowaniu użytkownika.


OnUnitActiveSec

Czas od ostatniego (poprzedniego) uruchomienia powiązanej usługi. Dzięki temu można np. cyklicznie powtarzać zadanie co określony czas, licząc od zakończenia poprzedniego wywołania.


OnUnitInactiveSec

Czas od wyłączenia (poprzedniego zakończenia) powiązanej usługi. Podobnie jak powyżej, lecz liczony od momentu zakończenia, a nie uruchomienia usługi.


Persistent

Opcja logiczna (true/false). Jeżeli ustawiona na true, to timer nadrobi pominięte wywołania po restarcie systemu. Domyślnie Persistent jest wyłączone

Przykład użycia:

[Timer]
OnCalendar=Mon..Fri *-*-* 10:00:00
Persistent=true

AccuracySec

Czas precyzji wywołania, domyślnie 1min. Timer zaplanowany na daną godzinę może zostać uruchomiony w oknie od tej godziny do +AccuracySec, aby zgrać wybudzenia i oszczędzać energię. Im mniejsza wartość (np. 1us), tym większa dokładność.


RandomizedDelaySec

Losowe opóźnienie dodawane do czasów zdefiniowanych powyżej, by zapobiec jednoczesnemu wybudzaniu wielu timerów. Domyślnie 0. Wartość można ustawić, gdy potrzebujemy rozproszyć obciążenie. Użyteczne w środowiskach współdzielonych między wieloma użytkownikami.


Przykłady zastosowania

Kilka praktycznych przykładów:

Automatyczne kopie zapasowe

Na przykład co noc o 3:00. Utwórzmy usługę backup.service:

# /etc/systemd/system/backup.service
[Unit]
Description=My backup service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh

Następnie plik timera backup.timer:

# /etc/systemd/system/backup.timer
[Unit]
Description=Daily backup

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
Unit=backup.service

[Install]
WantedBy=timers.target

Taki timer uruchomi backup codziennie o 3:00. Dzięki Persistent=true wykonanie zostanie nadrobione po restarcie, jeśli system był włączony po czasie 3:00.


Czyszczenie katalogów tymczasowych

Na przykład codziennie o 1:00 czyść katalog /tmp. Tworzymy usługę clean.service:

[Unit]
Description=Daily tmp cleaner

[Service]
Type=oneshot
ExecStart=/usr/local/bin/clean_tmp.sh

i timer clean.timer:

[Unit]
Description=Timer czyszczenia /tmp

[Timer]
OnCalendar=daily
Persistent=true
Unit=clean.service

[Install]
WantedBy=timers.target

Wyrażenie OnCalendar=daily to skrót dla *-*-* 00:00:00 (czyli północ każdego dnia). Skrypt clean_tmp.sh może usuwać stare pliki w /tmp.


📬 Potrzebujesz czegoś więcej?

Napisz na: chris@terminalzone.eu

Z chęcią odpowiem na Twoje pytania i dobiorę rozwiązanie dopasowane do Twoich potrzeb!