Skip to content
VDS · Aplikasi dan bot

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 timedatectl sebelum 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=oneshot membantu; di cron, gunakan lock melalui flock:
*/5 * * * * /usr/bin/flock -n /tmp/job.lock /usr/local/bin/job.sh