Skip to content
VDS · Aplikácie a boti

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 cez flock:
*/5 * * * * /usr/bin/flock -n /tmp/job.lock /usr/local/bin/job.sh