Ekspresi cron terlihat samar pada pandangan pertama - lima lapangan yang dipisahkan spasi dan dipenuhi tanda bintang, angka, garis miring, dan koma. Tetapi setiap lapangan memiliki logika yang konsisten, dan begitu Anda memahaminya, membaca dan menulis jadwal cron menjadi mudah. Panduan ini mengupas setiap bagian sintaks cron, menjelaskan karakter khusus, menunjukkan pola jadwal yang paling umum, dan membahas alat-alat yang mengurai, memvalidasi, dan mensimulasikan ekspresi cron sebelum Anda menerapkannya.
Apa itu ekspresi cron?
Ekspresi cron adalah rangkaian lima (atau kadang enam) lapangan yang dipisahkan spasi yang mendefinisikan jadwal berulang untuk tugas otomatis. Formatnya diciptakan bersama daemon cron di Unix pada awal 1970-an dan sejak itu praktis tidak berubah. Kini digunakan dalam file crontab Linux, pipeline CI/CD seperti GitHub Actions dan GitLab CI, penjadwal cloud seperti AWS EventBridge dan Google Cloud Scheduler, orkestrator kontainer seperti Kubernetes CronJob, serta kerangka kerja aplikasi seperti Spring dan Quartz.
Anatomi ekspresi cron
Format standar lima lapangan adalah:
┌----------- menit (0-59)
│ ┌--------- jam (0-23)
│ │ ┌------- hari dalam bulan (1-31)
│ │ │ ┌----- bulan (1-12)
│ │ │ │ ┌--- hari dalam minggu (0-7, Minggu = 0 atau 7)
│ │ │ │ │
* * * * * perintah yang dijalankanLapangan dibaca dari kiri ke kanan: menit, jam, hari dalam bulan, bulan, hari dalam minggu. Ekspresi "0 9 * * 1-5" berjalan pada 09:00 setiap hari kerja. Setiap lapangan dapat berisi satu nilai, daftar yang dipisahkan koma, rentang, langkah, wildcard, atau kombinasinya. Memahami operator-operator inilah keseluruhan keterampilan membaca cron.
Note
Sintaks ekspresi cron lapangan demi lapangan
Setiap lapangan memiliki rentang nilai bilangan bulat yang valid. Nilai di luar rentang yang valid menghasilkan galat atau salah konfigurasi yang diam-diam, tergantung implementasi cron. Memahami rentang valid setiap lapangan adalah fondasi membaca ekspresi cron apa pun.
Rentang valid tiap lapangan
- Menit - 0 sampai 59. Nilai 0 adalah puncak jam; nilai 59 adalah satu menit sebelum jam berikutnya.
- Jam - 0 sampai 23. Memakai format 24 jam: 0 adalah tengah malam, 12 adalah tengah hari, 23 adalah pukul 11 malam.
- Hari dalam bulan - 1 sampai 31. Hari dihitung mulai dari 1. Beberapa bulan punya hari lebih sedikit - Februari 28 atau 29, April/Juni/September/November 30.
- Bulan - 1 sampai 12. Januari adalah 1, Desember adalah 12. Beberapa implementasi juga menerima singkatan tiga huruf: JAN, FEB, MAR, dst.
- Hari dalam minggu - 0 sampai 7. Baik 0 maupun 7 mewakili Minggu. Senin adalah 1, Sabtu adalah 6. Beberapa implementasi mendukung MON, TUE, WED, THU, FRI, SAT, SUN.
Cara lapangan berinteraksi
Kelima lapangan dievaluasi bersama sebagai logika DAN - tugas berjalan ketika semua lapangan tanpa wildcard cocok secara bersamaan. "0 9 15 * *" berjalan tepat pada 09:00 setiap tanggal 15. Pengecualian kritisnya adalah ketika hari dalam bulan dan hari dalam minggu keduanya bernilai tanpa wildcard - dalam kasus itu, sebagian besar daemon cron berjalan jika SALAH SATU kondisi benar (logika ATAU), bukan keduanya. Ini adalah sumber terkenal perilaku yang tak terduga.
Warning
Karakter khusus dijelaskan
Kekuatan cron berasal dari karakter khususnya - operator yang mengubah nilai tetap menjadi pola jadwal yang fleksibel. Menguasai enam operator ini mencakup hampir semua pola penjadwalan yang akan Anda temui.
Enam operator inti
| Karakter | Nama | Contoh | Arti |
|---|---|---|---|
| * | Wildcard | * di menit | Semua nilai yang valid (0-59 untuk menit) |
| , | Daftar | 1,15,30 di menit | Pada menit 1, 15, dan 30 |
| - | Rentang | 1-5 di hari minggu | Senin sampai Jumat (hari 1 sampai 5) |
| / | Langkah | */15 di menit | Setiap 15 menit (0, 15, 30, 45) |
| ? | Tanpa nilai | ? di hari bulan | Tanpa nilai tertentu (hanya Quartz/Spring) |
| @ | Makro | @daily | Alias singkat (@daily = 0 0 * * *) |
Mengombinasikan operator
Operator dapat dikombinasikan dalam satu lapangan. "0,30 9-17 * * 1-5" berarti "pada menit 0 dan 30 setiap jam dari pukul 9 pagi hingga 5 sore, Senin sampai Jumat." Sintaks langkah juga bisa diterapkan pada rentang: "0-30/5" di lapangan menit berarti setiap 5 menit dari menit 0 hingga menit 30 (0, 5, 10, 15, 20, 25, 30). Penerjemah Cron ke Bahasa Manusia mengupas kombinasi apa pun menjadi bahasa yang lugas dengan penjelasan lapangan demi lapangan.
Tip
Pola jadwal cron yang umum
Sebagian besar jadwal cron di dunia nyata jatuh ke segelintir pola berulang. Mengenali pola-pola ini membuat Anda bisa membaca sebagian besar crontab produksi tanpa referensi.
- "* * * * *" - Setiap menit. Jadwal paling sering yang mungkin. Dipakai untuk pemeriksaan denyut dan pemantauan.
- "*/5 * * * *" - Setiap 5 menit. Umum untuk pekerjaan polling dan pemanasan cache.
- "0 * * * *" - Setiap jam tepat. Standar untuk proses batch per jam.
- "0 0 * * *" - Harian pada tengah malam (UTC). Bawaan untuk pekerjaan pembersihan harian.
- "0 9 * * 1-5" - Pukul 9 pagi setiap hari kerja. Jadwal standar jam kerja.
- "0 0 1 * *" - Tengah malam pada tanggal 1 setiap bulan. Penagihan bulanan, pembuatan laporan.
- "0 0 1 1 *" - Tengah malam 1 Januari. Pekerjaan tahunan - perpanjangan lisensi, laporan akhir tahun.
- "0 0 * * 0" - Tengah malam setiap Minggu. Jendela pemeliharaan mingguan.
Membangun jadwal kustom dari pola
Sebagian besar jadwal yang kompleks adalah kombinasi pola-pola ini. "0 2 * * 6,0" berarti "pukul 2 pagi hari Sabtu dan Minggu" - jendela pemeliharaan akhir pekan. "*/10 8-18 * * 1-5" berarti "setiap 10 menit dari pukul 8 pagi hingga 6 sore, hanya hari kerja." Jika Anda mengetahui jadwal target dalam bahasa lugas, Crontab Expression Builder memungkinkan Anda mengonfigurasi setiap lapangan secara visual dan menghasilkan ekspresi yang benar dengan konfirmasi yang mudah dibaca serta lima waktu eksekusi berikutnya.
Crontab Expression Builder
Bangun ekspresi cron secara visual dengan 15 prasetel, 5 mode lapangan, deskripsi bahasa lugas instan, dan pratinjau 5 waktu eksekusi berikutnya - gratis, tanpa pendaftaran.
Cara membuat dan memvalidasi ekspresi cron
Menulis ekspresi cron dari nol dan berharap ia benar itu berisiko. Satu lapangan yang tertukar atau operator yang disalahpahami bisa membuat pekerjaan berjalan pada waktu yang sepenuhnya salah - atau tidak pernah berjalan. Alat-alat ini menghilangkan risiko itu.
Tulis atau pilih ekspresi Anda
Buka Crontab Expression Builder lalu ketik ekspresi Anda langsung atau pilih dari 15 prasetel bawaan. Setiap prasetel mencakup pola jadwal yang umum (setiap menit, per jam, harian, hari kerja, bulanan) dan dapat disesuaikan dengan kontrol lapangan visual tanpa menyentuh ekspresi mentahnya.
Validasi galat sintaks
Tempelkan ekspresi ke Validator Ekspresi Cron. Ia memeriksa setiap lapangan terhadap rentang validnya, memvalidasi batas rentang (awal harus lebih kecil dari akhir), memastikan nilai langkah bukan nol, dan menandai makro yang tidak didukung crontab standar 5 lapangan. Setiap galat disertai pesan level baris yang menjelaskan apa yang diharapkan parser.
Terjemahkan ke bahasa lugas
Jalankan ekspresi yang sudah divalidasi melalui Penerjemah Cron ke Bahasa Manusia. Hasilnya adalah kalimat lengkap berbahasa lugas yang menjelaskan jadwal - "Pada pukul 2:30, hari Senin, Rabu, dan Jumat" - plus rincian lapangan demi lapangan. Jika deskripsinya tidak sesuai maksud Anda, revisi ekspresi sebelum diterapkan.
Simulasikan 12 bulan eksekusi ke depan
Untuk pekerjaan terjadwal yang waktunya penting - penagihan, ekspor data, jendela pemeliharaan - buka Interactive Cron Scheduler dan simulasikan ekspresi selama 12 bulan ke depan. Tampilan kalender menunjukkan kepadatan eksekusi bulanan, dan lini masa menunjukkan stempel waktu yang presisi. Pastikan jadwal berjalan pada tanggal yang diharapkan sebelum menggabungkan konfigurasi ke produksi.
Validator Ekspresi Cron
Validasi sintaks cron 5 lapangan, rentang, langkah, nilai daftar, dan makro dengan diagnostik instan per lapangan - lokal di browser, gratis, tanpa pendaftaran.
Cron dalam CI/CD dan penjadwal cloud
Sintaks cron dipakai jauh melampaui crontab Linux. Platform CI/CD dan cloud modern semuanya mengadopsi format 5 lapangan yang sama, tetapi masing-masing punya kekhasan sendiri dalam penanganan zona waktu, dukungan makro, dan batasan interval minimum.
Perbedaan antar platform
| Platform | Lapangan | Zona waktu | Makro | Interval min. |
|---|---|---|---|---|
| Linux crontab | 5 | Waktu lokal sistem | ✓ Semua 6 | Setiap menit |
| GitHub Actions | 5 | Hanya UTC | ✗ Tidak ada | Setiap 5 menit (pergeseran wajib 15 menit) |
| GitLab CI | 5 | Hanya UTC | ✓ Sebagian | Setiap menit |
| AWS EventBridge | 5 atau 6 | Hanya UTC | ✗ Tidak ada | Setiap menit |
| Google Cloud Scheduler | 5 atau unix | Zona IANA apa pun | ✓ Beberapa | Setiap menit |
| Kubernetes CronJob | 5 | Zona klaster | ✗ Tidak ada | Setiap menit |
| Spring Scheduler | 6 | Bawaan JVM | ✓ Ya | Setiap detik |
Penjadwalan cron di GitHub Actions
GitHub Actions memakai sintaks cron standar 5 lapangan tetapi selalu berjalan dalam UTC. Jika Anda ingin pekerjaan berjalan pukul 9 pagi waktu Timur (UTC-5), Anda menulis "0 14 * * *". GitHub Actions juga tidak mendukung sintaks makro (@daily, @weekly), jadi gunakan ekspresi lengkapnya. Workflow terjadwal saat beban tinggi bisa terlambat hingga 15 menit - rancang pekerjaan Anda agar toleran terhadap pergeseran ini.
Mengonversi cron ke timer systemd
Sistem Linux modern semakin banyak memakai timer systemd sebagai pengganti crontab klasik. Format OnCalendar dari systemd memakai sintaks berbeda tetapi mencakup pola yang sama. Konverter Cron ke Timer Systemd mengonversi ekspresi cron 5 lapangan apa pun ke konfigurasi unit timer systemd yang setara, termasuk templat lengkap file .timer dan .service.
Jebakan dan kasus tepi cron
Bahkan pengembang berpengalaman mengalami kegagalan senyap dengan cron. Inilah jebakan yang paling umum - masing-masing pernah membuat sistem produksi mengalami waktu henti yang tak terperhatikan atau eksekusi pekerjaan yang berlipat.
Kejutan zona waktu
Cron berjalan pada zona waktu lokal server secara bawaan. Jika server Anda di UTC tetapi bisnis Anda di New York (UTC-5), "0 9 * * *" berjalan pukul 4 pagi waktu setempat, bukan pukul 9 pagi. Platform cloud seperti GitHub Actions dan AWS EventBridge selalu berjalan dalam UTC, sehingga seluruh hitungan zona waktu menjadi tanggung jawab Anda. Selalu pastikan zona waktu sebelum menerapkan jadwal. Interactive Cron Scheduler memungkinkan Anda mensimulasikan eksekusi dengan penerapan offset zona waktu.
Kasus tepi akhir bulan
Menjadwalkan pekerjaan pada tanggal 29, 30, atau 31 membuatnya melewati bulan-bulan yang tidak memiliki tanggal itu secara diam-diam. "0 0 31 * *" tidak pernah berjalan pada April, Juni, September, atau November. "0 0 29 2 *" hanya berjalan pada Februari di tahun kabisat. Jika Anda butuh jadwal "hari terakhir setiap bulan", Anda butuh pendekatan yang lebih cerdas - baik berjalan harian dengan skrip yang memeriksa tanggal, maupun memakai penjadwal cloud yang mendukung sintaks hari L (terakhir).
Transisi waktu musim panas
Transisi waktu musim panas dapat membuat pekerjaan cron berjalan dua kali atau terlewat. Ketika jam dimajukan, waktu di dalam jam yang dilewati tidak pernah terjadi. Ketika jam dimundurkan, waktu di dalam jam yang diulang terjadi dua kali. Pekerjaan yang dijadwalkan pada zona waktu lokal dalam jendela transisi terpengaruh. Praktik teraman adalah menjalankan server dan penjadwal dalam UTC, yang tidak pernah memiliki transisi waktu musim panas.
Warning
Masalah setiap-detik
Cron standar 5 lapangan memiliki resolusi minimum satu menit. Jika Anda butuh pekerjaan berjalan setiap 10 detik, cron bukan alat yang tepat - gunakan timer sistem, antrean pekerjaan dengan penundaan, atau lapangan detik yang tersedia di Spring Scheduler dan Quartz. Mencoba mendekati jadwal di bawah satu menit dengan banyak entri crontab rawan galat dan menciptakan race condition saat pekerjaan saling tumpang tindih.
Key takeaways
- Ekspresi cron punya lima lapangan: menit (0-59), jam (0-23), hari dalam bulan (1-31), bulan (1-12), hari dalam minggu (0-7).
- Enam karakter khusus adalah * (wildcard), , (daftar), - (rentang), / (langkah), ? (tanpa nilai, hanya Quartz), dan @ (makro seperti @daily).
- Ketika hari dalam bulan dan hari dalam minggu keduanya tanpa wildcard, sebagian besar daemon cron berjalan jika SALAH SATU cocok - sumber umum eksekusi ganda yang tak terduga.
- Gunakan Crontab Expression Builder untuk membangun secara visual, Validator Ekspresi Cron untuk memeriksa sintaks, dan Interactive Cron Scheduler untuk mensimulasikan 12 bulan eksekusi.
- GitHub Actions memakai cron 5 lapangan hanya UTC tanpa dukungan makro; AWS EventBridge dan Google Cloud Scheduler juga memakai UTC; crontab Linux memakai zona waktu lokal sistem.
- Jangan menjadwalkan pada tanggal 29, 30, atau 31 jika pekerjaan harus berjalan setiap bulan - tanggal-tanggal itu tidak ada di setiap bulan.
- Cron standar punya resolusi minimum satu menit; untuk kebutuhan di bawah satu menit gunakan timer systemd, antrean pekerjaan, atau Spring/Quartz.