Cron Ekspresi Generator
Bangun dan pahami jadwal tugas cron secara visual.
Preset cepat
5 eksekusi berikutnya
Referensi sintaks cron
* · nilai apa pun
*/5 · setiap 5 unit
1,15 · pada nilai 1 dan 15
1-5 · rentang dari 1 hingga 5
Kolom: menit (0-59), jam (0-23), hari dalam bulan (1-31), bulan (1-12), hari dalam pekan (0-6, 0=Minggu)
Sejarah singkat ekspresi cron
Ekspresi cron lima bidang berasal dari Mei 1975, ketika versi awal dikirim dari AT&T Bell Laboratories sebagai bagian dari Research Unix Versi 7. Nama tersebut mengacu pada Chronos, personifikasi Yunani dari waktu. Formatnya sederhana: lima bidang yang dipisahkan oleh spasi (menit, jam, hari-dalam-bulan, bulan, hari-dalam-minggu) pada satu baris di /usr/lib/crontab. Penulisan ulang Vixie cron oleh Paul Vixie pada 1987 menjadi implementasi modern de facto; setiap distribusi Linux utama mengirim cron turunan Vixie, dan Vixie menambahkan crontab per pengguna, dukungan variabel lingkungan (MAILTO=, CRON_TZ=), dan makro pintasan @hourly / @daily / @reboot yang digunakan semua orang hari ini. Sintaks ekspresi cron kemudian bercabang ke dua jalur. Quartz Scheduler (Java, James House, 1998; disumbangkan ke Apache dan Terracotta) menambahkan bidang detik di depan, bidang tahun opsional di belakang, dan operator L (terakhir) / W (hari kerja) / # (kejadian ke-n), menghasilkan cron enam bidang yang kemudian diadopsi AWS EventBridge (semula CloudWatch Events, 2014) dan anotasi @Scheduled Spring. Format NCronTab yang digunakan oleh Azure Functions (2016) meletakkan detik pertama tetapi tetap mempertahankan lima bidang perilaku. Era cloud kemudian menstandarisasi format Vixie lima bidang sebagai lingua franca: Kubernetes CronJobs (alpha 1.4 di 2016, GA di 1.21 di 2021) menerima persis lima bidang, demikian pula GitHub Actions (on.schedule.cron, 2019), GCP Cloud Scheduler (2018), dan Vercel Cron Jobs (2022). Pembangun cron visual, kategori tempat alat ini berada, muncul sekitar 2010-2015: crontab.guru (Christine Dodrill, 2014) menjadi referensi yang paling banyak dikutip, dan pustaka cron-descriptor (Brady Holt, awalnya .NET, diporting ke Java/Python/JS) menggerakkan sebagian besar lapisan terjemahan «cron dalam bahasa Inggris sederhana» yang menjadi dasar bagi decoder dan generator. Setengah abad setelah Bell Labs, lima bidang yang sama masih menjadwalkan backup malam dunia.
Anatomi ekspresi cron
- Lima bidang, dipisahkan oleh spasi. Berurutan:
menit (0-59) jam (0-23) hari-dalam-bulan (1-31) bulan (1-12) hari-dalam-minggu (0-6). Ekspresi0 9 * * 1berarti «menit 0, jam 9, hari-dalam-bulan apa saja, bulan apa saja, hari minggu 1 (Senin)», yaitu pukul 9:00 setiap Senin. Bulan diindeks 1;0 0 1 0 *tidak valid karena tidak ada bulan 0. - Empat operator.
*cocok dengan setiap nilai dalam rentang bidang.,mencantumkan nilai diskrit:0,15,30,45di bidang menit.-mendefinisikan rentang:9-17di bidang jam mencakup pukul 9 pagi hingga 5 sore./menetapkan langkah:*/15di menit menyala pada 0, 15, 30, 45. Empat operator ini bergabung secara bebas:*/15 8-18 * * 1-5berarti «setiap 15 menit antara jam 8 dan 18, hanya hari kerja». - Makro pintasan. Vixie cron dan sebagian besar parser modern menerima
@yearly(atau@annually, setara dengan0 0 1 1 *),@monthly(0 0 1 * *),@weekly(0 0 * * 0),@daily(atau@midnight,0 0 * * *),@hourly(0 * * * *), dan khusus@reboot(dijalankan sekali saat daemon cron mulai). Platform cloud bervariasi: GitHub Actions dan Vercel menolak makro. - Jebakan langkah.
*/Ndi bidang dengan rentang a-b menyala pada a, a+N, a+2N, ..., tidak selalu setiap N unit waktu jam dinding.*/7di bidang menit menyala pada 0, 7, 14, 21, 28, 35, 42, 49, 56, lalu melompat kembali ke 0 di puncak jam berikutnya, menghasilkan jeda 4 menit. Penjadwalan setiap-7-menit yang sebenarnya tidak mungkin dalam cron standar tanpa pembungkus. - Jebakan OR (hari-dalam-bulan vs hari-dalam-minggu). Ketika kedua bidang dibatasi, cron Unix standar menyala ketika salah satu cocok, bukan keduanya.
0 0 1 * 1tidak berarti «Senin yang jatuh pada tanggal 1», berarti «setiap tanggal 1 bulan, ditambah setiap Senin». Halaman manualcrontab(5)eksplisit. Quartz, AWS EventBridge, dan timer systemd semuanya mengungkapkan «Senin pertama» dengan bersih; Vixie cron membutuhkan pembungkus. - Penomoran hari-dalam-minggu bervariasi. Linux/Vixie, GitHub Actions, GCP Cloud Scheduler, Kubernetes, Azure NCronTab, dan Spring 5.3+ semuanya menggunakan Minggu = 0 (Vixie juga menerima 7). Quartz dan AWS EventBridge menggunakan Minggu = 1.
0 0 * * 1oleh karena itu berarti «setiap Senin» di Linux tetapi «setiap Minggu» di bawah Quartz. Gunakan nama tiga huruf (MON,TUE) ketika portabilitas penting.
Di mana ekspresi digunakan
- cron Linux / macOS. Tempel ke
crontab -ediikuti oleh perintah. Nama (MON,JAN) dan makro pintasan (@hourly,@daily,@reboot) diterima. AturCRON_TZ=America/New_Yorkdi bagian atas crontab jika server di UTC tetapi Anda ingin menjadwalkan dalam waktu lokal. - Kubernetes CronJob. Atur
spec.scheduleke ekspresi lima bidang Anda.spec.timeZone(GA di 1.27, Maret 2023) menerima zona IANA seperti «Europe/Paris». MenyematkanTZ=dalam string jadwal ditolak dari 1.29 dan seterusnya. Gunakanspec.startingDeadlineSecondsuntuk mengontrol perilaku pemulihan setelah pemadaman. - GitHub Actions. Letakkan ke
on.schedule.cron. Jadwal berjalan di UTC, kecepatan terpendek adalah 5 menit (apa pun yang lebih halus secara diam-diam dibulatkan), dan alur kerja yang dijadwalkan di repositori publik dinonaktifkan secara otomatis setelah 60 hari tidak aktif repositori. String cron di dalam YAML harus dikutip untuk menghindari kebingungan parser dengan*di depan. - AWS EventBridge / EventBridge Scheduler. Menggunakan enam bidang:
cron(min hr dom mon dow yr). Membutuhkan?di hari-dalam-bulan atau hari-dalam-minggu (tidak keduanya literal). Operator gaya QuartzL(terakhir),W(hari kerja), dan#(kejadian ke-n) semuanya bekerja di sini. Produk Scheduler (2022) menambahkan ekspresiat()terpisah untuk timer satu kali. - GCP Cloud Scheduler. Sintaks lima bidang yang cocok dengan Linux. Properti
timeZonemenerima zona IANA. Gabungkan dengan Cloud Pub/Sub atau target HTTP.retryConfigmenangani kegagalan transien; defaultnya adalah tidak ada percobaan ulang, yang mengejutkan insinyur yang mengharapkan semantik setidaknya satu kali. - Vercel Cron Jobs. Sintaks lima bidang di
vercel.json. Kedua bidang hari tidak dapat diatur sekaligus. Paket Hobby membatasi kecepatan hingga harian; paket Pro mengizinkan setiap jam. Memicu HTTP GET ke jalur fungsi Anda, yang berarti fungsi harus idempoten jika pemicu pernah mencoba lagi.
Standar, dialek, dan tonggak sejarah
- cron AT&T Bell Labs (Mei 1975). Yang asli. Lima bidang, tidak ada crontab per pengguna, berjalan dari
/usr/lib/crontab. Bagian dari Research Unix Versi 7. Tata bahasa yang dipisahkan oleh spasi yang diperluas oleh semua varian modern. - Vixie cron (Paul Vixie, 1987). Penulisan ulang yang dijalankan semua orang. Menambahkan crontabs per pengguna, makro
@hourly/@daily/@reboot, alias nama (MON,JAN), dan variabel lingkunganMAILTO/CRON_TZ. Sebagian besar distribusi Linux mengirim Vixie cron, dcron, atau cronie (fork Red Hat dari Vixie). - Quartz Scheduler (James House, 1998). Pustaka Java yang memperkenalkan cron enam bidang (dengan detik di depan) dan operator
L/W/#. Disumbangkan ke Apache dan kemudian Terracotta. Anotasi@ScheduledSpring menyematkan semantik Quartz; Spring 5.3+ secara kontroversial mengubah hari-dalam-minggu dari «Minggu=1» Quartz ke «Minggu=0» Linux, sehingga string yang sama sekarang berarti hari yang berbeda di bawah versi yang berbeda. - timer systemd (Lennart Poettering, 2010). Menggantikan cron di sebagian besar distribusi Linux modern. Menggunakan tata bahasa yang berbeda (
OnCalendar=Mon..Fri 09:00), mendukung penjadwalan kalender dan monoton, mencatat kejournald, dapat menyatakan dependensi layanan, memvalidasi dengansystemd-analyze calendar, dan menggabungkan presisi gaya cron dengan pemulihan gaya anacron melaluiPersistent=true. - NCronTab (Azure Functions, 2016). Enam bidang dengan detik pertama:
{second} {minute} {hour} {day} {month} {day-of-week}. Tidak ada bidang tahun. Zona waktu default adalah UTC; override dengan pengaturan aplikasiWEBSITE_TIME_ZONEpada paket Linux App Service. - Sintaks cron AWS EventBridge. Enam bidang dengan tahun terakhir:
cron(min hr dom mon dow yr). Membutuhkan literal?sebagai placeholder di mana pun dari dom/dow yang tidak digunakan. Mendukung QuartzL,W,#. Semula CloudWatch Events (2014), diberi nama ulang EventBridge pada 2019. - Masalah portabilitas 5-vs-6 bidang. Menempelkan ekspresi lima bidang Linux ke Quartz atau Spring menghasilkan kesalahan «cron expression must consist of 6 fields»; menempelkan ekspresi enam bidang ke cron Linux menghasilkan «bad day-of-week» karena Linux membaca kolom detik sebagai menit. Kesalahan sebaliknya lebih berbahaya karena dapat secara diam-diam mengurai dan berjalan pada jadwal yang salah.
- Ekstensi
H(hash) Jenkins. Jenkins memperluas cron standar denganH, yang memilih nilai stabil tetapi diacak per pekerjaan alih-alih menjalankan setiap pekerjaan pada saat yang sama.H * * * *berarti «setiap jam, tetapi pada menit yang berbeda untuk setiap pekerjaan», mencegah masalah «kawanan menggelegar» ketika banyak pekerjaan dijadwalkan pada menit 0.
Pertanyaan yang lebih sering ditanyakan
Apakah lima bidang sama dengan enam atau tujuh?
Tidak. Bentuk POSIX klasik adalah lima bidang (menit, jam, hari-dalam-bulan, bulan, hari-dalam-minggu). Quartz dan Spring menggunakan enam bidang dengan menambahkan kolom detik di depan, dan Quartz menerima bidang tahun ketujuh opsional. AWS EventBridge selalu menggunakan enam bidang yang berakhir di tahun (cron(min hr dom mon dow yr)). Menempelkan ekspresi lima bidang ke Quartz atau Spring memunculkan kesalahan sintaks; menempelkan ekspresi enam bidang ke Linux secara diam-diam salah menafsirkan bidang.
Apa interval terkecil yang dapat diungkapkan cron?
Setiap menit (* * * * *) di cron Unix standar. Tidak ada bidang detik bawaan. Penjadwal seperti Quartz atau NCronTab menambahkan satu jika Anda membutuhkan kecepatan sub-menit, dan timer systemd dapat menggunakan OnUnitActiveSec=30s. GitHub Actions membatasi kecepatan terpendek hingga 5 menit, dan EventBridge menyala dalam jendela 60 detik dari waktu yang dijadwalkan, jadi jangan mengandalkan cron untuk presisi waktu nyata yang ketat.
Bagaimana saya menjalankan pekerjaan di hari terakhir bulan ini?
Cron lima bidang standar tidak memiliki operator native «hari terakhir bulan». Quartz dan AWS EventBridge mendukung L di bidang hari-dalam-bulan: 0 0 L * ? menyala pada tengah malam di hari terakhir. Pada cron Linux biasa, solusi biasa adalah menjadwalkan setiap hari pada hari kandidat dan memfilter perintah: 0 0 28-31 * * [ "$(date +\%d -d tomorrow)" = "01" ] && /path/to/script. Timer systemd mengungkapkannya secara langsung dengan OnCalendar=*-*-* 00:00:00.
Mengapa pekerjaan cron saya tidak berjalan ketika saya harapkan?
Tersangka biasa, secara berurutan: (1) server berada di zona waktu yang berbeda dari yang Anda asumsikan (periksa dengan date); (2) PATH tidak seperti yang dimiliki shell interaktif Anda, jadi perintah berfungsi di prompt tetapi gagal di bawah cron (gunakan path absolut); (3) output pergi ke email dan Anda melewatkannya (atur MAILTO="" atau alihkan ke file log); (4) daemon cron tidak berjalan (systemctl status cron); (5) jebakan OR (lihat di atas) menyala pada hari ekstra yang tidak Anda maksudkan.
Apa perbedaan antara cron, anacron, dan timer systemd?
Cron berharap sistem berjalan pada waktu yang dijadwalkan dan secara diam-diam melewati pekerjaan yang jatuh selama waktu henti: bagus untuk server selalu menyala, buruk untuk laptop. Anacron melacak stempel waktu terakhir-dijalankan per pekerjaan dan mengejar pekerjaan yang terlewat setelah reboot, dengan biaya presisi tingkat hari daripada menit. Timer systemd menggantikan cron di sebagian besar distribusi Linux modern: mereka mendukung penjadwalan kalender dan monoton, mencatat ke journald, dapat menyatakan dependensi layanan, dan menggunakan Persistent=true untuk menggabungkan presisi gaya cron dengan pemulihan gaya anacron.
Bagaimana zona waktu dan waktu musim panas memengaruhi cron?
Sebagian besar daemon cron menafsirkan jadwal di zona waktu sistem. Di server cloud itu biasanya berarti UTC, jadi 0 9 * * * menyala pada pukul 9 pagi UTC, bukan pukul 9 pagi lokal. Atur CRON_TZ=America/New_York di crontab Linux; Kubernetes menggunakan spec.timeZone; AWS, GCP, dan Vercel masing-masing menerima zona IANA eksplisit. Selama maju musim semi, pekerjaan yang dijadwalkan pada jam yang dilewati dijalankan segera setelahnya oleh Vixie cron tetapi dilewatkan sepenuhnya oleh AWS EventBridge. Pola yang paling aman adalah meninggalkan cron di UTC dan mengonversi di dalam pekerjaan.