Lewati ke isi

Server & Infrastruktur

Cara Membuat Cron Job di Linux dan Contohnya

Panduan cron job di Linux: arti lima kolom jadwal, crontab user dan sistem, contoh siap pakai, log output, jebakan PATH, dan systemd timer.

Terbit 6 menit baca

Jawaban singkat

Cron menjalankan perintah sesuai jadwal lima kolom: menit, jam, tanggal, bulan, dan hari. Buat dengan crontab -e, pakai path lengkap, arahkan output ke log, dan ingat cron berjalan dengan environment minimal. Untuk jadwal yang butuh logging rapi atau catch-up setelah mati, systemd timer lebih cocok.

Daftar isi
  1. Bagaimana membaca lima kolom jadwal cron?
  2. Langkah membuat cron job
  3. Langkah 1. Buka crontab user
  4. Langkah 2. Tulis perintah dengan path lengkap
  5. Langkah 3. Arahkan output ke log
  6. Langkah 4. Pastikan tidak tumpang tindih
  7. Langkah 5. Uji dengan environment ala cron
  8. Contoh cron job yang sering dipakai
  9. Apa beda crontab user dan crontab sistem?
  10. Kapan memakai systemd timer daripada cron?
  11. Pertanyaan yang sering diajukan

Ada skrip yang harus jalan sendiri setiap malam, tanpa kamu login ke server? Itu tugas cron. Cron adalah layanan penjadwal bawaan hampir semua distro Linux: kamu menulis satu baris berisi jadwal dan perintah, lalu cron menjalankannya tepat waktu, berulang, sampai baris itu dihapus.

Yang membuat orang tersandung biasanya bukan sintaksnya, tapi hal kecil di sekitarnya: perintah jalan normal di terminal tapi gagal di cron, output hilang entah ke mana, atau jadwal meleset karena zona waktu. Panduan ini membahas semuanya berurutan.

Bagaimana membaca lima kolom jadwal cron?

Setiap baris crontab punya format:

┌ menit (0-59)
│ ┌ jam (0-23)
│ │ ┌ tanggal (1-31)
│ │ │ ┌ bulan (1-12)
│ │ │ │ ┌ hari dalam minggu (0-7, 0 dan 7 = Minggu)
│ │ │ │ │
* * * * * perintah

Simbol yang perlu diingat cukup empat. Bintang * berarti "setiap". Koma memisahkan beberapa nilai (1,15). Tanda hubung membuat rentang (1-5 untuk Senin sampai Jumat). Garis miring membuat kelipatan (*/10 di kolom menit berarti setiap 10 menit).

Ada satu sifat yang sering mengejutkan: bila kolom tanggal dan hari sama-sama diisi (bukan *), cron menjalankan perintah ketika salah satu cocok, bukan keduanya. Jadi 0 9 1 * 1 berjalan setiap tanggal 1 dan juga setiap Senin.

Langkah membuat cron job

Langkah 1. Buka crontab user

crontab -e

Perintah ini membuka crontab milik user yang sedang login di editor. Simpan dan keluar, cron langsung memuat perubahan tanpa perlu restart. Lihat isinya dengan crontab -l. Hati-hati dengan crontab -r, karena perintah itu menghapus seluruh crontab tanpa konfirmasi.

Untuk tugas yang butuh hak root, gunakan sudo crontab -e. Jangan menjalankan semuanya sebagai root hanya karena praktis. Tugas aplikasi sebaiknya jalan sebagai user aplikasinya.

Langkah 2. Tulis perintah dengan path lengkap

Cron tidak memuat .bashrc atau profil login kamu. PATH-nya biasanya sangat pendek, seperti /usr/bin:/bin. Akibatnya, perintah yang terpasang di /usr/local/bin atau lewat nvm, pyenv, dan sejenisnya tidak ditemukan.

Solusinya: tulis path lengkap, atau tetapkan variabel di bagian atas crontab.

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=""

15 1 * * * /usr/local/bin/bersih-cache.sh

Cari path sebuah perintah dengan command -v nama-perintah.

Langkah 3. Arahkan output ke log

Secara bawaan, cron mencoba mengirim output perintah lewat email lokal. Di banyak VPS tidak ada mail server, jadi output itu hilang begitu saja. Simpan ke file:

0 3 * * * /usr/local/bin/laporan.sh >> /var/log/laporan.log 2>&1

>> menambahkan ke file, 2>&1 ikut menangkap pesan error. Jangan lupa log ini juga perlu dirotasi agar tidak membengkak. Log yang tumbuh tanpa batas adalah salah satu penyebab disk server penuh.

Langkah 4. Pastikan tidak tumpang tindih

Kalau tugas dijadwalkan tiap 5 menit tapi kadang butuh 7 menit, dua proses bisa berjalan bersamaan dan saling mengganggu. Bungkus dengan flock:

*/5 * * * * flock -n /tmp/sinkron.lock /usr/local/bin/sinkron.sh

Dengan -n, proses baru langsung keluar bila proses sebelumnya masih memegang kunci.

Langkah 5. Uji dengan environment ala cron

Cara cepat meniru kondisi cron adalah menjalankan skrip dengan environment kosong:

env -i /bin/bash -c '/usr/local/bin/laporan.sh'

Kalau di sini gagal, di cron juga akan gagal. Untuk memastikan cron benar-benar mengeksekusi, lihat log sistem: journalctl -u cron di Debian dan Ubuntu, atau journalctl -u crond di keluarga Red Hat.

Contoh cron job yang sering dipakai

JadwalBaris crontabArti
Setiap 10 menit*/10 * * * * perintahMenit 0, 10, 20, dan seterusnya
Setiap jam lewat 5 menit5 * * * * perintah01.05, 02.05, ...
Harian pukul 02.3030 2 * * * perintahCocok untuk backup
Hari kerja pukul 08.000 8 * * 1-5 perintahSenin sampai Jumat
Setiap Minggu tengah malam0 0 * * 0 perintahPembersihan mingguan
Tanggal 1 tiap bulan0 6 1 * * perintahLaporan bulanan
Saat server menyala@reboot perintahSekali setelah boot

Singkatan seperti @daily, @weekly, dan @reboot didukung oleh implementasi cron yang umum di Linux. Contoh nyata untuk backup ada di backup database otomatis.

Apa beda crontab user dan crontab sistem?

Crontab user (yang diedit dengan crontab -e) tidak punya kolom user, karena semua perintahnya berjalan sebagai pemiliknya.

File sistem seperti /etc/crontab dan file di /etc/cron.d/ punya satu kolom tambahan setelah jadwal, yaitu nama user:

0 4 * * * www-data /usr/local/bin/laporan.sh

Paket perangkat lunak biasanya menaruh jadwalnya di /etc/cron.d/. Ada juga folder /etc/cron.daily/, /etc/cron.weekly/, dan seterusnya, berisi skrip yang dijalankan sesuai nama foldernya. Di Debian dan Ubuntu, nama file di folder itu tidak boleh mengandung titik, sehingga backup.sh tidak akan dijalankan tapi backup akan.

Zona waktu juga patut dicek. Cron memakai zona waktu sistem, jadi pastikan timedatectl menunjukkan zona yang kamu maksud, misalnya Asia/Jakarta.

Kapan memakai systemd timer daripada cron?

Cron tetap pilihan paling ringkas untuk jadwal sederhana. systemd timer layak dipertimbangkan bila kamu butuh:

  • Catch-up: dengan Persistent=true, jadwal yang terlewat karena server mati dijalankan begitu server menyala.
  • Log otomatis: output masuk ke journal dan bisa dibaca dengan journalctl -u nama.service.
  • Kontrol sumber daya: batas CPU, memori, atau user khusus bisa diatur di unit service.
  • Status yang jelas: systemctl list-timers menampilkan jadwal berikutnya dan kapan terakhir jalan.

Gantinya, kamu menulis dua file (service dan timer) untuk setiap tugas. Cara menulis unit service dibahas di membuat service systemd.

Pertanyaan yang sering diajukan

Kenapa skrip jalan normal di terminal tapi tidak di cron?

Penyebab paling umum adalah PATH dan variabel environment yang berbeda, path relatif ke file, atau izin eksekusi. Pakai path lengkap, cd ke folder kerja di awal skrip, dan uji dengan env -i.

Bisakah cron menjalankan tugas setiap detik?

Tidak. Satuan terkecil cron adalah menit. Untuk interval di bawah satu menit, gunakan systemd timer atau proses yang berjalan terus dengan jeda di dalamnya.

Bagaimana menonaktifkan cron job sementara?

Tambahkan tanda pagar di awal barisnya lewat crontab -e. Baris yang diawali pagar dianggap komentar dan tidak dijalankan.

Apakah persen di perintah cron perlu perlakuan khusus?

Ya. Di crontab, tanda persen diartikan sebagai baris baru. Tulis sebagai % bila dipakai di perintah, misalnya pada format tanggal date +%F.

Sebelum meninggalkan crontab yang baru kamu tulis:

  • Jadwal sudah dicek ulang, terutama kolom tanggal dan hari
  • Semua perintah memakai path lengkap atau PATH sudah ditetapkan
  • Output diarahkan ke log yang dirotasi
  • Tugas panjang dibungkus flock
  • Skrip sudah diuji dengan env -i
  • Zona waktu server sesuai harapan

Baca juga