Tugas terjadwal: cron dan timer systemd
Cara menjalankan tugas terjadwal, mengapa tugas berjalan manual tetapi diam saja di cron, dan kapan harus beralih ke timer systemd.
Diperbarui 23 Agustus 2026
Backup, perpanjangan sertifikat, pembersihan file sementara, laporan malam — semuanya adalah tugas terjadwal. Di Linux, Anda menyelesaikannya dengan dua cara: cron klasik dan timer systemd.
Cron: mulai cepat
Anda mengedit jadwal pengguna seperti ini:
crontab -e
crontab -l
Format barisnya adalah lima kolom dan sebuah perintah:
# 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
Singkatan yang berguna: @daily, @hourly, @reboot. Untuk memeriksa apakah tugas benar-benar berjalan:
grep CRON /var/log/syslog | tail -30
journalctl -u cron --since "1 hour ago"
Mengapa skrip berjalan manual tetapi tidak di cron
Ini masalah yang paling umum, dan penyebabnya hampir selalu salah satu dari tiga hal.
Lingkungan berbeda. Cron memiliki PATH yang minimal dan tidak memiliki variabel Anda dari .bashrc. Gunakan path lengkap ke program dan set variabel secara eksplisit di awal skrip atau di crontab:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Direktori berbeda. Tugas dimulai di direktori home pengguna, jadi path relatif menunjuk ke tempat lain. Selalu gunakan path absolut.
Output tidak ke mana-mana. Ada error, tetapi tidak ada yang melihatnya. Tulis log:
0 4 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Dua hal kecil lagi: karakter % dalam baris cron harus di-escape sebagai \%, dan file crontab harus diakhiri dengan baris baru — jika tidak, tugas terakhir akan diabaikan.
Anda perlu memverifikasi dari luar bahwa sebuah tugas berjalan. Cron yang diam terlihat persis sama dengan yang berhasil. Siapkan push check di Uptime Kuma: skrip melakukan ping ke sebuah alamat di akhir, dan jika belum melakukan ping selama sehari, Anda mendapat peringatan.
Timer systemd
Ketika tugas lebih kompleks daripada satu perintah, timer lebih nyaman: ada journal, dependensi, batas sumber daya, dan perlindungan terhadap dua salinan yang berjalan bersamaan.
# /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 mengejar jadwal yang terlewat jika mesin mati — cron tidak bisa melakukan itu. RandomizedDelaySec menyebarkan beban agar selusin tugas tidak dimulai pada detik yang sama.
Yang perlu diperhatikan
- Waktu mesin secara default adalah UTC. Periksa
timedatectlsebelum Anda menetapkan "pukul 4 pagi". - Tugas berat (arsip, verifikasi backup) terikat pada disk. Lihat kecepatan disk dan jadwalkan pada malam hari.
- Tugas panjang yang berjalan setiap lima menit akan tumpang tindih dengan dirinya sendiri. Di systemd,
Type=oneshotmembantu; di cron, gunakan lock melaluiflock:
*/5 * * * * /usr/bin/flock -n /tmp/job.lock /usr/local/bin/job.sh