Lompat ke konten
Aback Tools Logo

Pengurai Cron: Memahami Ekspresi Cron

Cara membaca, menulis, dan memvalidasi ekspresi cron: sintaks lapangan demi lapangan, karakter khusus, pola jadwal yang umum, perbedaan antar platform, jebakan yang sering terjadi, dan alat gratis untuk mengurai serta mensimulasikan jadwal.

DH
Tutorials & How-Tos12 menit baca2,700 kata

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.

5Lapangan cron standarmenit, jam, hari dalam bulan, bulan, hari dalam minggu
15+Prasetel jadwal bawaandi Crontab Expression Builder
12moHorizon simulasidi Interactive Cron Scheduler

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:

format ekspresi cron
text
┌----------- 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 dijalankan

Lapangan 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

Beberapa platform memakai format 6 lapangan yang menambahkan lapangan detik pada posisi 0 (sebelum menit). Spring Scheduler dan Quartz memakai format ini. AWS EventBridge dan sebagian besar daemon cron Unix memakai 5 lapangan. Selalu periksa format yang diharapkan platform tujuan Anda - ekspresi yang ditulis untuk satu platform bisa menghasilkan jadwal yang salah secara diam-diam di platform lain.

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

Perilaku ATAU antara hari-dalam-bulan dan hari-dalam-minggu adalah salah satu jebakan cron paling umum. "0 9 1 * 1" TIDAK berarti "Senin pertama setiap bulan pukul 09:00" - artinya "09:00 pada tanggal 1 setiap bulan, ATAU 09:00 pada hari Senin apa pun." Gunakan skrip atau penjadwal terkelola dengan logika yang sadar kalender jika Anda butuh semantik "Senin pertama setiap bulan" yang sebenarnya.

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

KarakterNamaContohArti
*Wildcard* di menitSemua nilai yang valid (0-59 untuk menit)
,Daftar1,15,30 di menitPada menit 1, 15, dan 30
-Rentang1-5 di hari mingguSenin sampai Jumat (hari 1 sampai 5)
/Langkah*/15 di menitSetiap 15 menit (0, 15, 30, 45)
?Tanpa nilai? di hari bulanTanpa nilai tertentu (hanya Quartz/Spring)
@Makro@dailyAlias 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

Saat membaca ekspresi cron yang tidak dikenal, urai setiap lapangan dari kiri ke kanan dan terjemahkan secara independen. Pertama lapangan menit, lalu jam, lalu hari dalam bulan, lalu bulan, lalu hari dalam minggu. Baca setiap lapangan tanpa tanda bintang sebagai batasan: "hanya ketika menit = X", "hanya ketika jam = Y", dst. Hasilnya terbaca sebagai kalimat ketika disusun dalam urutan terbalik dari kanan ke kiri.

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.

  1. "* * * * *" - Setiap menit. Jadwal paling sering yang mungkin. Dipakai untuk pemeriksaan denyut dan pemantauan.
  2. "*/5 * * * *" - Setiap 5 menit. Umum untuk pekerjaan polling dan pemanasan cache.
  3. "0 * * * *" - Setiap jam tepat. Standar untuk proses batch per jam.
  4. "0 0 * * *" - Harian pada tengah malam (UTC). Bawaan untuk pekerjaan pembersihan harian.
  5. "0 9 * * 1-5" - Pukul 9 pagi setiap hari kerja. Jadwal standar jam kerja.
  6. "0 0 1 * *" - Tengah malam pada tanggal 1 setiap bulan. Penagihan bulanan, pembuatan laporan.
  7. "0 0 1 1 *" - Tengah malam 1 Januari. Pekerjaan tahunan - perpanjangan lisensi, laporan akhir tahun.
  8. "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.

Open tool

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.

1

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.

2

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.

3

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.

4

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.

Open tool

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

PlatformLapanganZona waktuMakroInterval min.
Linux crontab5Waktu lokal sistem✓ Semua 6Setiap menit
GitHub Actions5Hanya UTC✗ Tidak adaSetiap 5 menit (pergeseran wajib 15 menit)
GitLab CI5Hanya UTC✓ SebagianSetiap menit
AWS EventBridge5 atau 6Hanya UTC✗ Tidak adaSetiap menit
Google Cloud Scheduler5 atau unixZona IANA apa pun✓ BeberapaSetiap menit
Kubernetes CronJob5Zona klaster✗ Tidak adaSetiap menit
Spring Scheduler6Bawaan JVM✓ YaSetiap 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

Jangan pernah mengandalkan cron untuk eksekusi tepat-satu-kali yang kritis waktu. Daemon cron bisa melewatkan eksekusi jika sistem mati, sedang reboot, beban berat, atau jamnya disesuaikan. Untuk transaksi finansial, desain pekerjaan idempoten dan antrean pekerjaan dengan penanganan dead-letter lebih andal daripada penjadwalan cron mentah.

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.

Pertanyaan yang sering diajukan

A cron resolver is a tool that parses a cron expression and translates it into a human-readable schedule description and a list of the next scheduled run times. Given an expression like "0 9 * * 1-5", a resolver tells you "At 09:00 AM, Monday through Friday" and shows you the next five dates and times the job will fire. The Aback Tools Cron to Human-Readable Translator and Interactive Cron Scheduler both perform this resolution instantly in your browser without uploading anything to a server.

The five fields are minute (0-59), hour (0-23), day of month (1-31), month (1-12), and day of week (0-7, where both 0 and 7 represent Sunday). They run left to right in that order. The expression "30 8 * * 1" means "At 8:30 AM, every Monday." An asterisk (*) in any field means "every valid value for that field." Most standard crontab implementations use exactly these five fields; some extended formats (Spring Scheduler, Quartz) add a sixth seconds field at the start.

An asterisk (*) is the wildcard character in cron - it means "match every valid value for this field." In the minute field, * means every minute (0-59). In the hour field, * means every hour (0-23). In the day-of-week field, * means every day. So "* * * * *" runs every minute of every hour every day. It is the broadest possible value for any field. Use it when a field should not restrict the schedule rather than listing every value explicitly.

Range syntax specifies a span of consecutive values: "1-5" in the day-of-week field means Monday through Friday. Step syntax uses a forward slash to specify an interval: "*/15" in the minute field means every 15 minutes (0, 15, 30, 45). They can be combined: "0-30/10" means every 10 minutes from minute 0 to minute 30 (0, 10, 20, 30). Step syntax is commonly used to run jobs at regular intervals without listing every value explicitly.

Use the step syntax in the minute field: "*/5 * * * *". This expression fires at minutes 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, and 55 of every hour, every day. If you need to run every 5 minutes but only during business hours (9 AM to 5 PM, Monday to Friday), use "*/5 9-17 * * 1-5". Validate the expression in the Cron Expression Validator and preview the exact fire times in the Interactive Cron Scheduler before deploying.

Cron macros are shorthand aliases for common schedule expressions. The most widely supported are @reboot (run once at startup), @yearly or @annually ("0 0 1 1 *"), @monthly ("0 0 1 * *"), @weekly ("0 0 * * 0"), @daily or @midnight ("0 0 * * *"), and @hourly ("0 * * * *"). Support varies by scheduler - Linux crontab and most Unix cron daemons support all six; AWS EventBridge, Google Cloud Scheduler, and GitHub Actions do not support macro syntax. The Cron to Human-Readable Translator handles macros and expands them to their equivalent expressions.

The most common causes are timezone mismatch (cron runs in the server's local timezone, often UTC), off-by-one in day-of-week numbering (0 and 7 both mean Sunday on most systems, but not all), and the interaction between day-of-month and day-of-week fields (when both are non-wildcard, most cron implementations fire if EITHER condition is true, not both). Use the Interactive Cron Scheduler to simulate the exact fire times in UTC versus your expected timezone before concluding there is a bug.

Yes. GitHub Actions supports cron scheduling via the `schedule` trigger with a `cron:` key using standard 5-field cron syntax. GitHub Actions runs on UTC, so adjust your expression accordingly. Note that GitHub Actions does not support cron macros (@daily, @weekly, etc.) - use the full 5-field expression instead. Also, scheduled workflows may not run at exactly the specified time during periods of high load; expect up to 15 minutes of drift. The Crontab Expression Builder generates GitHub Actions-compatible expressions with next run time previews.

ShareXLinkedIn