Cron
Cron spouští příkazy v naplánovaný čas. Používá se pro zálohy, čištění logů nebo pravidelné kontroly.
Syntaxe
┌───── 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 a 7 = neděle)
│ │ │ │ │
* * * * * prikazPříklady
| Výraz | Kdy se spustí |
|---|---|
0 5 * * * | každý den v 5:00 |
*/15 * * * * | každých 15 minut |
0 */6 * * * | každých 6 hodin |
0 3 * * 0 | každou neděli ve 3:00 |
30 2 1 * * | 1. den v měsíci ve 2:30 |
@reboot | při startu systému |
Úprava crontabu
Otevři svůj crontab
crontab -ePřidej řádek
0 3 * * * /usr/local/bin/zaloha.sh >> /var/log/zaloha.log 2>&1Ulož a ověř
crontab -lCron běží s minimální proměnnou PATH. Příkazy zadávej vždy absolutní
cestou (/usr/bin/mysqldump, ne mysqldump). Je to nejčastější důvod, proč
úloha „nic nedělá”.
Logování výstupu
Bez přesměrování cron pošle výstup e-mailem, který nikdo nečte.
# Vsechno do logu
0 3 * * * /skript.sh >> /var/log/skript.log 2>&1
# Zahod bezny vystup, chyby do logu
0 3 * * * /skript.sh > /dev/null 2>> /var/log/skript-chyby.log2>&1 znamená „přesměruj chybový výstup tam, kam jde běžný”. Bez toho ti v
logu chyby chybí.
Příklad: denní záloha databáze
#!/bin/bash
set -euo pipefail
DATUM=$(date +%F)
CIL="/var/backups/db-${DATUM}.sql.gz"
/usr/bin/mysqldump --single-transaction -u zaloha -p"${DB_HESLO}" mojedb \
| /usr/bin/gzip > "${CIL}"
# smaz zalohy starsi 14 dni
/usr/bin/find /var/backups -name 'db-*.sql.gz' -mtime +14 -deletechmod +x /usr/local/bin/zaloha.shHeslo nikdy nepiš přímo do crontabu. Je čitelné pro každého, kdo vidí seznam
procesů. Ulož ho do ~/.my.cnf s právy 600.
Kontrola, že cron běží
# Bezi sluzba?
systemctl status cron
# Log spusteni
grep CRON /var/log/syslog | tail -20Časová zóna
timedatectl
sudo timedatectl set-timezone Europe/PragueZměna časové zóny ovlivní časy všech cron úloh. Zkontroluj, že se ti záloha nepřesunula do špičky.
Systemd timer jako alternativa
Pro složitější úlohy je systemd timer lepší — má logy v journalctl, umí
závislosti a nezmeškané spuštění dožene.
[Unit]
Description=Denni zaloha
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.targetTimer spouští stejnojmennou .service jednotku (zaloha.timer → zaloha.service).
Bez ní timer nemá co spustit:
[Unit]
Description=Denni zaloha
[Service]
Type=oneshot
ExecStart=/usr/local/bin/zaloha.shAktivace:
sudo systemctl daemon-reload
sudo systemctl enable --now zaloha.timerStav a další spuštění ověříš přes systemctl list-timers.
Tipy
- Otestuj skript ručně dřív, než ho dáš do cronu.
- Nepouštěj náročné úlohy ve špičce.
- Ověřuj, že záloha vznikla. Cron chybu spolkne mlčky.
Poznámka
U herních serverů použij Scheduler v panelu. Do systému nemáš přístup.