Cron adalah penjadwal tugas tertua dan paling banyak digunakan dalam komputasi — cron Unix asli dikirimkan pada tahun 1975 dan sintaksis ekspresinya pada dasarnya tidak berubah oleh setiap sistem penjadwalan modern, mulai dari crontab Unix hingga CronJobs Kubernetes hingga penjadwal cloud di AWS, GCP, dan Azure. Meskipun ada di mana-mana, ekspresi cron terkenal rawan kesalahan jika ditulis dengan tangan, dan satu karakter yang salah dapat mengubah pekerjaan sehari-hari menjadi pekerjaan sekali dalam satu jam yang akan merusak sistem produksi. Bagian di bawah ini menjelaskan struktur 5 bidang, karakter khusus yang memperluasnya, dan hal-hal praktis yang menarik perhatian para insinyur berpengalaman sekalipun.
Struktur 5 Bidang dan Arti Masing-masing Bidang
Ekspresi cron standar memiliki tepat 5 bidang yang dipisahkan spasi dalam urutan tetap: menit, jam, hari dalam sebulan, bulan, hari dalam seminggu. Setiap bidang menerima nomor dalam rentang validnya (menit 0–59, jam 0–23, hari di bulan 1–31, bulan 1–12, hari di minggu 0–6 dengan 0 = Minggu), wildcard `*` yang berarti nilai apa pun, atau sintaksis khusus apa pun yang dijelaskan di bagian berikutnya. Bidang mengikuti pola zoom-in kronologis: menit adalah yang paling tepat, hari dalam seminggu adalah yang paling umum untuk pola mingguan. Detail yang rumit adalah bidang hari dalam seminggu: varian Unix yang berbeda secara historis tidak setuju apakah hari Minggu adalah 0 atau 7, dan standar modern menerima keduanya karena kompatibilitasnya. Bidang bulan dan hari dalam seminggu juga menerima singkatan tiga huruf (`JAN`-`DEC`, `SUN`-`SAT`), yang peka huruf besar-kecil dan seringkali lebih mudah dibaca dibandingkan nilai numerik. Ketika hari dalam sebulan dan hari dalam seminggu ditentukan, sebagian besar implementasi cron menggunakan logika OR (pekerjaan berjalan jika salah satu cocok), bukan logika AND (keduanya diperlukan pencocokan). Ini adalah salah satu sumber kebingungan yang paling umum — `0 0 15 * FRI` dijalankan pada tengah malam tanggal 15 setiap bulan DAN setiap hari Jumat, tidak hanya pada hari Jumat yang jatuh pada tanggal 15.
Karakter Khusus: Langkah, Rentang, Daftar, dan Wildcard
Empat karakter khusus memperluas sintaks cron dasar dan menangani sebagian besar kebutuhan penjadwalan dunia nyata. Tanda bintang `*` adalah wildcard setiap nilai: `* * * * *` diaktifkan setiap menit, setiap jam, setiap hari. Garis miring `/` memperkenalkan nilai langkah: `*/15` di bidang menit diaktifkan pada menit 0, 15, 30, 45 — setiap 15 menit. Langkah-langkah dapat digabungkan dengan rentang: `9-17/2` menyala pada jam 9, 11, 13, 15, 17. Tanda hubung `-` memperkenalkan rentang: `9-17` mencakup pukul 09.00 hingga 17.00 inklusif di bidang jam. Koma `,` memperkenalkan daftar: `1,3,5` pada kolom hari dalam seminggu berarti Senin, Rabu, Jumat. Kombinasi ini bebas terjadi — `0 9,12,17 * * 1-5` kebakaran pada jam 9 pagi, siang hari, dan jam 5 sore pada hari kerja. Beberapa implementasi cron menambahkan spesial tambahan di luar dasar-dasar ini. Quartz (digunakan oleh banyak perpustakaan penjadwalan Java) menambahkan `L` (hari terakhir bulan/minggu), `W` (hari kerja terdekat), dan `#` (kemunculan hari ke-n dalam sebulan). Jenkins menambahkan `H` untuk nilai hash yang mendistribusikan jadwal identik sepanjang waktu untuk menghindari efek kawanan yang menggelegar. Alat ini menargetkan format 5 bidang standar yang digunakan oleh Unix crontab, AWS EventBridge, GCP Cloud Scheduler, Azure Logic Apps, dan pustaka penjadwalan paling populer seperti node-cron dan python-crontab.
Gotcha Praktis Yang Dapat Ditangkap Bahkan Insinyur Berpengalaman
Beberapa cron gotcha berulang kali menyebabkan insiden produksi bahkan untuk tim yang menggunakan cron setiap hari. Pertama, penanganan zona waktu: ekspresi cron dijalankan di zona waktu lokal sistem secara default, yang berarti transisi DST pada bulan Maret dan November dapat menyebabkan pekerjaan dilewati satu hari atau dijalankan dua kali tergantung pada arah transisi. Selalu konfigurasikan tugas cron untuk dijalankan dalam UTC jika memungkinkan, atau uji secara eksplisit akhir pekan transisi DST sebelum menerapkan jadwal yang sensitif terhadap waktu. Kedua, logika hari dalam sebulan vs hari dalam seminggu OR yang dibahas di atas menangkap logika yang diharapkan oleh para insinyur. Jika Anda ingin suatu tugas dijalankan hanya pada hari Jumat yang jatuh pada tanggal 15, Anda tidak dapat menyatakannya dalam cron standar — Anda perlu menggunakan logika AND dalam kode aplikasi setelah tugas tersebut dijalankan. Ketiga, kasus tepi tahun kabisat: `0 0 29 2 *` hanya berjalan pada tanggal 29 Februari, yang terjadi setiap 4 tahun sekali. Mengujinya sekali dan melihatnya tampaknya tidak berhasil itu mudah. Keempat, `@reboot` dan spesial lainnya seperti `@daily` atau `@hourly` didukung oleh banyak implementasi tetapi tidak portabel — penjadwal cloud umumnya tidak menerimanya. Selalu gunakan formulir 5 bidang eksplisit untuk portabilitas. Kelima, tugas yang sudah berjalan lama dapat saling tumpang tindih: jika tugas dijalankan setiap 5 menit namun membutuhkan waktu 7 menit untuk dieksekusi, dua instance akan dijalankan secara bersamaan. Bungkus dengan file kunci (`flock` di Linux) atau gunakan koordinasi tingkat aplikasi untuk mencegah hal ini.