Cron adalah layanan di Linux dan macOS yang menjalankan perintah secara otomatis sesuai jadwal. Kamu menulis jadwalnya sekali, lalu cron yang mengeksekusi perintahnya setiap kali waktunya cocok, walaupun kamu lagi tidur atau gak login. Mirip alarm berulang di HP: "Senin sampai Jumat, jam 06:00". Kamu gak menyalakan alarm itu tiap pagi, kamu cukup mengatur polanya. Bedanya, pola cron ditulis sebagai lima kolom.
🧪 Tebakan cepat: jadwal
0 0 13 * 5jalan kapan: cuma hari Jumat yang jatuh di tanggal 13, atau lebih sering dari itu? Tebak dulu, jawabannya ada di bagian "Tanggal dan hari diisi dua-duanya".
Satu baris crontab: lima kolom waktu, lalu perintah
Jadwal cron disimpan di crontab (cron table), satu daftar untuk tiap user. Tiap baris berisi lima kolom waktu, lalu perintah yang dijalankan:
┌───────── menit (0-59)
│ ┌─────── jam (0-23)
│ │ ┌───── tanggal (1-31)
│ │ │ ┌─── bulan (1-12)
│ │ │ │ ┌─ hari (0-7: 0 dan 7 = Minggu, 1 = Senin, 6 = Sabtu)
│ │ │ │ │
0 9 * * 1-5 /home/budi/laporan.sh
Setiap menit, cron mengecek tiap baris: apakah waktu sekarang cocok dengan kelima kolom? Kalau cocok, perintahnya dijalankan. Baris di atas artinya menit 0, jam 9, tanggal berapa pun, bulan apa pun, hari Senin sampai Jumat: tiap hari kerja jam 09:00.
Cron biasa gak punya kolom detik. Paling sering, sebuah baris jalan sekali per menit.
Simbol di tiap kolom
| Tulisan | Artinya | Contoh |
|---|---|---|
* |
semua nilai | di kolom menit: tiap menit |
30 |
satu nilai | di kolom menit: menit 30 |
0,30 |
daftar nilai | di kolom menit: menit 0 dan 30 |
1-5 |
rentang, kedua ujungnya ikut | di kolom hari: Senin sampai Jumat |
*/15 |
langkah 15, dihitung dari awal rentang | di kolom menit: 0, 15, 30, 45 |
9-17/2 |
rentang dengan langkah | di kolom jam: 9, 11, 13, 15, 17 |
*/15 artinya "menit yang habis dibagi 15", bukan "15 menit setelah terakhir jalan". Hitungannya mulai lagi tiap jam, jadi */40 jalan di menit 0 dan 40: jaraknya 40 menit, lalu 20 menit.
Membaca jadwal: lima contoh dari Lab
Jam di Lab berhenti di Kamis, 8 Oktober 2026, 14:37. Dari situ, ini tiga jadwal berikutnya untuk tiap expression (deretan lima kolom itu disebut cron expression):
| Expression | Artinya | Tiga jadwal berikutnya |
|---|---|---|
0 9 * * 1-5 |
Setiap hari kerja jam 09:00 | Jum 9 Okt, Sen 12 Okt, Sel 13 Okt, jam 09:00 |
*/15 * * * * |
Setiap 15 menit | 14:45, 15:00, 15:15 |
0 0 * * * |
Setiap hari jam 00:00 | Jum 9 Okt, Sab 10 Okt, Min 11 Okt, jam 00:00 |
0 0 1 * * |
Setiap awal bulan jam 00:00 | 1 Nov, 1 Des, 1 Jan 2027, jam 00:00 |
30 2 * * 3 |
Setiap Rabu jam 02:30 | Rab 14 Okt, Rab 21 Okt, Rab 28 Okt, jam 02:30 |
0 9 * * 1-5: Jumat 9 Oktober masuk. Sabtu (6) dan Minggu (0) gak ada di1-5, jadi dilewati, lalu lanjut Senin.*/15 * * * *: jam 14:37 sudah lewat dari 14:30, jadi yang berikutnya 14:45.0 0 1 * *: cuma tanggal 1. Tanggal 1 Oktober sudah lewat, jadi berikutnya 1 November.
Tanggal dan hari diisi dua-duanya
Ada satu aturan yang sering bikin kaget. Kalau kolom tanggal dan kolom hari sama-sama dibatasi (dua-duanya gak diawali *), cron jalan kalau salah satunya cocok.
Jadi 0 0 13 * 5 jalan tiap tanggal 13 dan juga tiap hari Jumat. Dari Kamis 8 Oktober 2026, jadwal berikutnya: Jum 9 Okt, Sel 13 Okt, Jum 16 Okt, Jum 23 Okt. Bukan cuma "Jumat tanggal 13". Itu jawaban tebakannya.
Kalau salah satu kolom diawali *, kolom itu gak ikut menentukan: 0 9 * * 1-5 cuma melihat hari, 0 0 1 * * cuma melihat tanggal.
Mengelola crontab
crontab -e # buka crontab-mu di editor; simpan untuk memasangnya
crontab -l # tampilkan isi crontab-mu
crontab -r # hapus SEMUA jadwalmu, tanpa tanya
$ crontab -l
no crontab for budi
$ crontab -e
crontab: installing new crontab
$ crontab -l
0 9 * * 1-5 /home/budi/laporan.sh >> /home/budi/laporan.log 2>&1
crontab -emembuka editor. Kamu tambah satu baris, simpan, keluar, dan crontab memasangnya.- Kalau ada kolom yang salah, misalnya menit
60, crontab menolak menyimpan dengan pesanbad minutedanerrors in crontab file, can't install.Lab-nya menampilkan pesan yang sama. - Ada juga singkatan:
@hourly=0 * * * *,@daily=0 0 * * *,@weekly=0 0 * * 0,@monthly=0 0 1 * *,@yearly=0 0 1 1 *, dan@reboot= sekali setiap server menyala.
Di latihan: memecah expression dengan JavaScript
Latihannya ditulis dalam JavaScript. Kamu memecah expression jadi lima teks, lalu memberi deskripsinya:
const [minute, hour, day, month, weekday] = "0 9 * * 1-5".split(" ");
console.log(minute); // 0
console.log(weekday); // 1-5
console.log(String(hour).padStart(2, "0") + ":" + String(minute).padStart(2, "0")); // 09:00
split(" ")memecah teks di tiap spasi jadi array lima teks.split(/\s+/)lebih aman kalau spasinya lebih dari satu.const [minute, hour, day, month, weekday] = ...memberi nama ke isi array sesuai urutan kolomnya. Semuanya tetap teks, jadiweekdayberisi"1-5"apa adanya.padStart(2, "0")menambah nol di depan sampai panjangnya 2:"9"jadi"09","0"jadi"00".
Deskripsi di latihan cuma untuk empat pola di tabel tadi. Expression lain, seperti 30 2 * * 3, dideskripsikan apa adanya: Terjadwal: 30 2 * * 3.
⚠️ Jebakan yang sering ketemu
- Cron gak membaca
PATH-mu. Cron menjalankan perintah dengan environment minimal, biasanya cumaPATH=/usr/bin:/bin. Perintah yang jalan di terminalmu bisa gagal di cron. Tulis path lengkap:/usr/bin/node /home/budi/backup.js. - Output-nya hilang. Cron gak punya layar. Simpan ke file log dengan
>> /home/budi/backup.log 2>&1, supaya pesan error (2>&1) ikut tersimpan. - Mengira tanggal dan hari digabung dengan "dan". Kalau dua-duanya diisi, cukup salah satu yang cocok.
- Lupa zona waktu. Cron memakai jam server. Banyak server memakai UTC, jadi
0 9 * * *di server UTC jalan jam 16:00 WIB.
TL;DR: Cron menjalankan perintah sesuai jadwal di crontab. Tiap baris: lima kolom waktu (menit, jam, tanggal, bulan, hari; 0 dan 7 = Minggu) lalu perintah. * semua nilai, , daftar, - rentang, */15 langkah yang dihitung dari awal rentang. Kalau tanggal dan hari dua-duanya diisi, cron jalan saat salah satunya cocok. crontab -e untuk menambah jadwal, -l untuk melihat, -r menghapus semuanya. Pakai path lengkap, simpan output ke log dengan >> file.log 2>&1, dan ingat cron memakai zona waktu server.