Systemd.timer umožňuje volat service v pravidelných intervalech, podobně jako se volají úlohy v cronu.

Nejprve je potřeba vytvořit unitu .service. Na úlohy, které doběhnou a skončí se hodí typ oneshot. Oblíbený příklad je pravidelné volání programu fstrim:

Připravíme si soubor /etc/systemd/system/fstrim.service:

[Unit]
Description=Discard unused blocks

[Service]
Type=oneshot
ExecStart=/sbin/fstrim -a

Můžeme reloadnout systemd a zkusit fstrim spustit:

systemctl daemon-reload
systemctl start fstrim

V logu (systemctl status fstrim) bychom měli vidět úspěšné dokončení běhu programu a ukončení service. Pokud je vše v pořádku, můžeme nastavit timer.

Obsah souboru /etc/systemd/system/fstrim.timer:

[Unit]
Description=Discard unused blocks once a week
Documentation=man:fstrim

[Timer]
OnCalendar=weekly
AccuracySec=1h
Persistent=true

[Install]
WantedBy=timers.target

Soubor .timer se musí jmenovat stejně jako .service, kterou chceme pravidelně spouštět.

Opět reloadneme systemd:

systemctl daemon-reload

A aktivujeme timer:

systemctl enable fstrim.timer
systemctl start fstrim.timer

A je to.

Pozor na logy

Bohužel nefunguje správně logování služeb, které běží jen velmi krátkou dobu. Záznamy v logu (journalctl) jsou, jen nemají všechny atributy. Tedy vyhledávání pomocí journalctl -u fstrim nemusí vždy nalézt všechny výsledky. Je tedy nutné filtrovat jinak, například pomocí jména procesu. Tento bug je řešen jako issue 2913.