Servery a DevOps

Cron vs. systemd timer: plánování úloh na Linuxu prakticky

Kdy použít crontab a kdy systemd timer. Syntaxe, příklady, logování výstupu, Persistent, náhodné zpoždění a nejčastější chyby s PATH a procenty.

12. 10. 2026 · 4 min čtení

Pravidelné úlohy – zálohy, čištění cache, odesílání reportů, obnova dat – patří na každý server. Linux nabízí dvě cesty: klasický cron a systemd timery. Obě fungují, každá se hodí na něco jiného.

Cron: rychle a jednoduše

Úlohy uživatele upravíte přes:

crontab -e

Formát řádku:

┌ minuta (0–59)
│ ┌ hodina (0–23)
│ │ ┌ den v měsíci (1–31)
│ │ │ ┌ měsíc (1–12)
│ │ │ │ ┌ den v týdnu (0–7, 0 i 7 = neděle)
│ │ │ │ │
30 3 * * * /opt/scripts/backup.sh

Užitečné příklady:

*/5 * * * *   /opt/scripts/healthcheck.sh       # každých 5 minut
0 * * * *     /opt/scripts/hourly.sh            # každou celou hodinu
15 2 * * 1    /opt/scripts/weekly.sh            # pondělí 2:15
0 4 1 * *     /opt/scripts/monthly.sh           # 1. den v měsíci ve 4:00
@reboot       /opt/scripts/on-boot.sh           # po startu

Výpis úloh: crontab -l. Systémové úlohy najdete v /etc/crontab a /etc/cron.d/ (tam se navíc uvádí uživatel jako šestý sloupec).

Tři klasické chyby v cronu

1. Jiné PATH. Cron spouští příkazy s minimálním prostředím (typicky PATH=/usr/bin:/bin). Příkaz, který v terminálu funguje, v cronu neprojde. Používejte absolutní cesty nebo PATH nastavte na začátku crontabu:

PATH=/usr/local/bin:/usr/bin:/bin

2. Znak %. V crontabu znamená nový řádek. date +%F musíte escapovat:

0 3 * * * /usr/bin/tar czf /backup/www-$(date +\%F).tar.gz /var/www

3. Ztracený výstup. Když cron nemá kam poslat e-mail, výstup a chyby zmizí. Přesměrujte je:

30 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1

Systemd timer: dva soubory, víc kontroly

Timer se skládá ze služby (co spustit) a časovače (kdy). Příklad pro denní zálohu.

/etc/systemd/system/backup.service:

[Unit]
Description=Denní záloha

[Service]
Type=oneshot
User=root
ExecStart=/opt/scripts/backup.sh

/etc/systemd/system/backup.timer:

[Unit]
Description=Spouštět zálohu denně ve 3:30

[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
RandomizedDelaySec=10min

[Install]
WantedBy=timers.target

Aktivace:

sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers

Povolujete timer, ne službu.

Co timery umějí navíc

  • Persistent=true – pokud byl server ve 3:30 vypnutý, úloha se spustí hned po startu.
  • RandomizedDelaySec – rozloží zátěž, když stejnou úlohu spouští víc serverů.
  • Logy zdarma – journalctl -u backup.service ukáže výstup i exit kód každého běhu.
  • Žádné souběhy – když předchozí běh ještě neskončil, nový se nespustí.
  • Ruční spuštění – sudo systemctl start backup.service spustí úlohu přesně ve stejném prostředí jako timer. Ideální pro testování.
  • Limity a izolace – na službu můžete použít MemoryMax=, Nice=, ProtectSystem= a další volby.

Syntaxe OnCalendar

Zápis Význam
hourly každou hodinu
daily denně o půlnoci
*-*-* 03:30:00 denně ve 3:30
Mon *-*-* 08:00 pondělí v 8:00
Mon..Fri 18:00 pracovní dny v 18:00
*-*-01 04:00 první den v měsíci
*:0/15 každých 15 minut

Zápis si ověřte předem:

systemd-analyze calendar "Mon..Fri 18:00"

Výstup ukáže normalizovaný tvar a čas dalšího spuštění.

Kromě kalendáře existují i relativní časovače, např. OnBootSec=5min a OnUnitActiveSec=1h („hodinu po posledním spuštění“).

Srovnání

cron systemd timer
Nastavení 1 řádek 2 soubory
Logování ruční přesměrování journald automaticky
Zmeškané běhy ztratí se (bez anacronu) Persistent=true
Souběh běhů může nastat nenastane
Ruční test spustit skript ručně (jiné prostředí) systemctl start
Přenositelnost téměř všude jen systémy se systemd

Kdy co použít

  • Cron: rychlá uživatelská úloha, jednoduchý skript, sdílený hosting, kde nemáte root.
  • Timer: produkční úlohy na vlastním VPS, kde chcete logy, jistotu spuštění po výpadku a kontrolu nad zdroji.

Ochrana před souběhem v cronu

Pokud zůstáváte u cronu a úloha může trvat déle než interval, použijte flock:

*/10 * * * * /usr/bin/flock -n /tmp/sync.lock /opt/scripts/sync.sh

Přepínač -n zajistí, že když zámek drží předchozí běh, nový se ihned ukončí místo čekání.

Ať zvolíte cokoli, výsledek úlohy občas zkontrolujte – nejhorší záloha je ta, o které nevíte, že už měsíc neběží.