Apa itu ekspresi cron?
Ekspresi cron adalah string penjadwalan ringkas yang memberi tahu penjadwal tugas kapan tepatnya harus menjalankan sebuah tugas. Format ini lahir pada tahun 1975 di dalam daemon Unix V7 cron dan hampir tidak berubah sejak saat itu — tata bahasa lima field yang sama muncul saat ini di Kubernetes CronJob, AWS EventBridge, alur kerja GitHub Actions, Google Cloud Scheduler, GitLab CI, pipeline Jenkins, dan biner crontab yang masih disertakan dengan setiap distribusi Linux. Tata bahasa ini mengemas banyak makna dalam tiga belas karakter atau lebih, itulah mengapa sebuah parser yang mengubahnya menjadi bahasa Indonesia biasa adalah perbedaan antara deploy yang percaya diri dan rollback pukul 3 pagi.
Bagaimana ekspresi cron bekerja?
Ekspresi cron standar memiliki lima field yang dipisahkan spasi yang bersama-sama mendefinisikan jadwal berulang. Mesin memeriksa jam dinding saat ini terhadap ekspresi setiap menit dan menjalankan tugas ketika kelima field cocok. Field-field tersebut, dari kiri ke kanan:
- Menit (0–59). Menit berapa dalam jam tugas berjalan.
0berarti tepat pada jam,30berarti setengah lewat,*/5berarti setiap lima menit (00, 05, 10, ...), dan15,45berarti pada seperempat dan seperempat kurang. - Jam (0–23). Jam berapa dalam sehari pada jam 24.
0adalah tengah malam,9adalah pukul 09.00,17adalah pukul 17.00. Rentang (9-17untuk jam kerja) dan nilai langkah (*/2untuk setiap dua jam) bekerja dengan cara yang sama seperti untuk menit. - Hari dalam bulan (1–31). Hari kalender mana yang dijalankan.
1berarti tanggal 1 bulan ini,*berarti setiap hari,1,15berarti tanggal 1 dan 15. Berhati-hatilah dengan31— ini diam-diam melewatkan bulan yang tidak memiliki hari ke-31. - Bulan (1–12 atau JAN–DES). Bulan mana yang dijalankan.
*berarti setiap bulan,1,7berarti Januari dan Juli,1-3berarti hanya Q1. Nama bulan tiga huruf tidak peka huruf besar-kecil di sebagian besar implementasi. - Hari dalam minggu (0–7, di mana 0 dan 7 keduanya berarti Minggu). Membatasi eksekusi pada hari kerja tertentu.
1-5adalah Senin hingga Jumat,0,6adalah akhir pekan,MON-FRIberfungsi di sebagian besar parser. Ketika hari-dalam-bulan dan hari-dalam-minggu keduanya diatur ke nilai tertentu, cron klasik mengeksekusi pada salah satu yang cocok (OR logis), yang mengejutkan banyak orang.
Mengapa menggunakan parser ekspresi cron?
- Tangkap kesalahan baca diam sebelum deploy. Ekspresi `0 2 */3 * *` dieksekusi pukul 02.00 setiap tiga hari, bukan setiap tiga menit — tempelkan di sini dan Anda akan melihatnya dalam bahasa Indonesia sebelum dikirim ke produksi.
- Sebagian besar penjadwal cloud berjalan dalam UTC secara default. Pratinjau sepuluh waktu eksekusi berikutnya di zona lokal Anda mengungkap penyimpangan DST satu jam sebelum ada yang dihubungi pukul 3 pagi.
- Pintasan seperti `@daily`, `@weekly`, dan `@monthly` memang nyaman tapi ambigu. Parser menampilkan bentuk lima field yang mendasarinya sehingga Anda tahu persis apa yang dijadwalkan.
- Pembuat field per field memungkinkan Anda menyusun jadwal satu kolom sekaligus dan melihat deskripsi bahasa Indonesia diperbarui secara langsung, jauh lebih cepat daripada membaca halaman manual cron untuk kesepuluh kalinya.
Di mana ekspresi cron digunakan?
Sintaks cron muncul di mana saja ketika sebuah tugas perlu berulang berdasarkan jam. Tiga permukaan paling umum, dengan gotcha persis yang terkenal pada masing-masingnya:
- Jadwal pencadangan. Entri `crontab -e` klasik yang mengirimkan dump database ke S3 pukul 02.00 setiap malam, atau merotasi arsip `pg_dump` pada tanggal 1 setiap bulan. Baris seperti `0 2 * * * /usr/local/bin/backup.sh` telah dikirimkan di lebih banyak server Linux daripada baris cron lainnya. Dapatkan menit dan jam yang tepat, arahkan stderr ke tempat yang tahan lama, dan Anda telah menggantikan daftar periksa manual dengan skrip yang berjalan otomatis.
- Pemicu `schedule` GitHub Actions. Kunci `on.schedule.cron` dalam `.github/workflows/*.yml` menerima cron lima field standar, tetapi pekerjaan selalu berjalan dalam UTC dan GitHub akan diam-diam melewatkan waktu eksekusi jika antrean runner sibuk. Pola umum: `cron: '0 9 * * 1-5'` untuk mengirim digest Senin-Jumat pukul 09.00 UTC. Pratinjau di zona lokal Anda terlebih dahulu agar Anda tidak menjanjikan digest pukul 09.00 WIB yang sebenarnya tiba pukul 16.00.
- AWS EventBridge Scheduler. Ekspresi cron EventBridge mengambil field keenam untuk tahun dan mengharuskan `?` alih-alih `*` di field hari-dalam-bulan atau hari-dalam-minggu — `cron(0 9 ? * MON-FRI *)` adalah terjemahan EventBridge dari cron standar hari kerja pukul 09.00 yang klasik. Digunakan untuk pemanggilan Lambda terjadwal, eksekusi tugas ECS, dan start state-machine Step Function; ketidakselarasan dengan sintaks cron klasik adalah sumber utama kesalahan `ValidationException` dalam deploy CloudFormation.
Seperti apa ekspresi cron yang nyata?
Ambil 0 9 * * 1-5 — dieksekusi pukul 09.00, setiap hari kerja. Membaca field dari kiri ke kanan: 0 adalah menit ke-nol dari jam, 9 adalah pukul 09.00 pada jam 24, * pada hari-dalam-bulan berarti setiap hari kalender, * pada bulan berarti setiap bulan, dan 1-5 pada hari-dalam-minggu membatasi eksekusi pada Senin hingga Jumat (di mana 1 = Senin dalam penomoran cron standar). Tempelkan ke masukan di atas dan parser mengonfirmasi Pukul 09.00, Senin hingga Jumat dengan sepuluh tanggal eksekusi berikutnya yang ditampilkan dalam zona IANA yang Anda pilih. Maksud yang sama dalam sintaks AWS EventBridge adalah cron(0 9 ? * MON-FRI *) — perhatikan field tahun di akhir dan ? di mana cron standar menggunakan *.
Ekspresi cron tidak kenal ampun dalam satu hal: typo menghasilkan jadwal yang valid secara sintaksis namun dieksekusi pada waktu yang salah, tanpa kesalahan yang bisa ditangkap dalam code review. Membaca `0 0 1 * *` dan mengetahui bahwa itu berjalan tengah malam pada tanggal 1 setiap bulan, bukan pada 1 Januari, membutuhkan latihan. Parser di atas mengubah latihan itu menjadi pemeriksaan kewarasan sepuluh detik — tempelkan ekspresi, baca bahasa Indonesia, pindai sepuluh waktu eksekusi berikutnya di zona lokal Anda, dan kirimkan YAML dengan mengetahui bahwa baris cron benar-benar melakukan apa yang dikatakan pesan commit.
Apa perbedaan antara cron 5 field dan 6 field?
Cron lima field adalah tata bahasa Unix klasik dengan resolusi satu menit. Cron enam field menambahkan kolom detik di depan untuk penjadwalan sub-menit — digunakan oleh Quartz dan `@Scheduled` Spring. AWS EventBridge juga menggunakan enam field, tetapi kolom tambahannya adalah tahun di belakang, bukan detik.
Apa arti @hourly, @daily, dan @weekly?
Nama panggilan Vixie-cron yang diperkenalkan pada tahun 1987. @hourly = 0 * * * *, @daily = 0 0 * * *, @weekly = 0 0 * * 0, @monthly = 0 0 1 * *, @yearly = 0 0 1 1 *. @reboot dieksekusi sekali saat boot. GitHub Actions dan EventBridge menolak alias ini.
Apakah Minggu adalah hari 0 atau hari 7 dalam cron?
Keduanya, dalam Vixie cron klasik — 0 dan 7 keduanya diterima sehingga rentang seperti 5-7 terbaca secara alami sebagai Jumat-hingga-Minggu. Senin selalu 1, Sabtu selalu 6. Quartz dan AWS EventBridge menggunakan konvensi yang berbeda: 1-7 dengan Minggu sebagai 1. Periksa dokumentasi platform sebelum berasumsi.
Bagaimana cron menangani penghematan waktu siang hari?
Bergantung pada zona waktu mesin. Dalam UTC (default di EventBridge, Kubernetes, dan GitHub Actions) DST tidak ada. Di zona DST lokal, Vixie cron klasik melewatkan tugas selama celah spring-forward dan menjalankannya dua kali selama fall-back; timer systemd mengeksekusi tepat sekali.