Zakazani zadaci: cron i systemd tajmeri
Kako da pokreneš zakazane zadatke, zašto zadatak radi ručno ali ćuti u cron-u i kada da pređeš na systemd tajmere.
Ažurirano 23. avgust 2026.
Bekapovi, obnavljanje sertifikata, čišćenje privremenih fajlova, noćni izveštaji — sve su to zakazani zadaci. Na Linuxu ih rešavaš na dva načina: klasičnim cron-om i systemd tajmerima.
Cron: brzi početak
Raspored za korisnika uređuješ ovako:
crontab -e
crontab -l
Format linije je pet polja i komanda:
# 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
Korisne skraćenice: @daily, @hourly, @reboot. Da proveriš da li su se zadaci uopšte izvršili:
grep CRON /var/log/syslog | tail -30
journalctl -u cron --since "1 hour ago"
Zašto skript radi ručno, ali ne i u cron-u
Ovo je najčešći problem, a uzrok je skoro uvek jedan od tri.
Drugačije okruženje. Cron ima minimalan PATH i nijednu tvoju promenljivu iz .bashrc. Koristi pune putanje do programa i eksplicitno postavi promenljive na početku skripte ili u crontab-u:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Drugačiji direktorijum. Zadatak počinje u kućnom direktorijumu korisnika, pa relativne putanje vode negde drugde. Uvek koristi apsolutne putanje.
Izlaz odlazi u prazno. Došlo je do greške, ali je niko nije video. Piši log:
0 4 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Još dve male stvari: znak % u cron liniji mora biti escapovan kao \%, a crontab fajl mora da se završi novim redom — u suprotnom se poslednji zadatak ignoriše.
Potrebno je da spolja proveriš da se zadatak izvršio. Tihi cron izgleda isto kao i uspešan. Podesi push proveru u Uptime Kuma: skript na kraju pinguje adresu, a ako nije pingovao ceo dan, dobijaš alert.
systemd tajmeri
Kada je zadatak složeniji od jedne komande, tajmer je praktičniji: ima journal, zavisnosti, ograničenja resursa i zaštitu od toga da se dve kopije pokrenu istovremeno.
# /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 nadoknađuje propušteno pokretanje ako je mašina bila isključena — cron to ne može. RandomizedDelaySec raspoređuje opterećenje da desetak zadataka ne krene u istoj sekundi.
Šta imati na umu
- Vreme mašine je podrazumevano UTC. Proveri
timedatectlpre nego što postaviš „4 ujutru”. - Teški zadaci (arhive, verifikacija bekapova) opterećuju disk. Pogledaj brzinu diska i zakaži ih za noć.
- Dug zadatak koji se pokreće svakih pet minuta preklopiće se sam sa sobom. U systemd-u pomaže
Type=oneshot; u cron-u koristi lock prekoflock:
*/5 * * * * /usr/bin/flock -n /tmp/job.lock /usr/local/bin/job.sh