Plánované úlohy: cron a systemd timery
Ako spúšťať plánované úlohy, prečo úloha funguje ručne, ale v cron ticho mlčí, a kedy prejsť na systemd timery.
Aktualizované 23. augusta 2026
Zálohy, obnova certifikátov, čistenie dočasných súborov, nočné reporty — to všetko sú naplánované úlohy. Na Linuxe ich vyriešiš dvoma spôsobmi: klasickým cronom a systemd timermi.
Cron: rýchly štart
Rozvrh používateľa upravíš takto:
crontab -e
crontab -l
Formát riadku je päť polí a príkaz:
# min hour day month day-of-week command
0 4 * * * /usr/local/bin/backup.sh
*/15 * * * * /usr/local/bin/check.sh
30 3 * * 0 /usr/bin/systemctl restart myapp
Užitočné skratky: @daily, @hourly, @reboot. Na kontrolu, či sa úlohy vôbec spustili:
grep CRON /var/log/syslog | tail -30
journalctl -u cron --since "1 hour ago"
Prečo skript funguje ručne, ale v crone nie
Toto je najčastejší problém a príčina je takmer vždy jedna z troch.
Iné prostredie. Cron má minimálny PATH a žiadne z tvojich premenných z .bashrc. Používaj úplné cesty k programom a premenné nastav explicitne na začiatku skriptu alebo v crontabe:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Iný adresár. Úloha sa spúšťa v domovskom adresári používateľa, takže relatívne cesty ukazujú niekam inam. Vždy používaj absolútne cesty.
Výstup nikam nevedie. Nastala chyba, ale nikto ju nevidel. Zapíš log:
0 4 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Ešte dve drobnosti: znak % v riadku cronu musí byť escapovaný ako \% a súbor crontabu musí končiť novým riadkom — inak sa posledná úloha ignoruje.
Potrebuješ zvonku overiť, že sa úloha spustila. Tichý cron vyzerá presne rovnako ako úspešný. Nastav si push kontrolu v Uptime Kuma: skript na konci pingne adresu, a ak deň nepingol, dostaneš upozornenie.
systemd timery
Keď je úloha zložitejšia než jediný príkaz, timer je pohodlnejší: má journal, závislosti, limity zdrojov a ochranu pred tým, aby bežali dve kópie naraz.
# /etc/systemd/system/backup.service
[Unit]
Description=Nightly backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Run nightly backup
[Timer]
OnCalendar=*-*-* 04:00:00
Persistent=true
RandomizedDelaySec=15m
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers
journalctl -u backup.service -n 50
Persistent=true dobehne zmeškané spustenie, ak bol stroj vypnutý — cron to nevie. RandomizedDelaySec rozloží záťaž, aby tucet úloh nezačalo v tej istej sekunde.
Čo mať na pamäti
- Čas stroja je štandardne UTC. Pred nastavením „4:00“ skontroluj
timedatectl. - Náročné úlohy (archívy, overovanie záloh) sú viazané na disk. Pozri rýchlosť disku a naplánuj ich na noc.
- Dlhá úloha, ktorá beží každých päť minút, sa bude prekrývať sama so sebou. V systemd pomôže
Type=oneshot; v crone použi zámok cezflock:
*/5 * * * * /usr/bin/flock -n /tmp/job.lock /usr/local/bin/job.sh