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.
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.serviceukáž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.servicespustí ú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ěží.