Lewati ke konten
Toova
Semua Alat

Sintaks Ekspresi Cron Dijelaskan

Toova

Ekspresi cron adalah salah satu topik yang dipelajari developer sekali, lupa detailnya, dan kemudian mencari lagi setiap enam bulan. String lima karakter seperti 30 9 * * 1-5 dapat mengkodekan jadwal yang sangat spesifik — "setiap hari kerja pukul 9:30 pagi" — tetapi sintaksnya memiliki cukup edge case untuk menyebabkan kebingungan nyata: field berbasis-0 vs berbasis-1, Minggu yang bisa berupa 0 dan 7, perbedaan antara standar Unix dan ekstensi enam-field Quartz, dan perilaku halus dari nilai langkah yang digabungkan dengan rentang.

Panduan ini membahas sintaks cron dari prinsip-prinsip pertama, kemudian menelusuri setiap karakter khusus dengan contoh konkret. Apakah Anda menulis job cron untuk daemon Linux, mengonfigurasi jadwal GitHub Actions, atau menyiapkan aturan AWS EventBridge, konsep dasar yang sama berlaku — dengan beberapa perbedaan platform penting yang dijelaskan di sepanjang jalan.

Lima Field Standar

Ekspresi cron standar memiliki lima field yang dipisahkan spasi, dibaca dari kiri ke kanan: menit, jam, hari dalam bulan, bulan, dan hari dalam minggu. Setiap field membatasi kapan job berjalan sepanjang dimensi tersebut. Job berjalan hanya saat kelima field cocok secara bersamaan.

# Field          Posisi  Rentang       Karakter khusus
# ─────────────────────────────────────────────────
# Menit            1     0-59          * / , -
# Jam              2     0-23          * / , -
# Hari dalam bulan 3     1-31          * / , - ? L W
# Bulan            4     1-12 atau JAN-DEC   * / , -
# Hari dalam minggu 5    0-7 (0=7=Min) atau SUN-SAT  * / , - ? L #

Membaca ekspresi seperti 30 9 * * 1-5: menit 30, jam 9, hari mana pun dalam bulan, bulan mana pun, hari-dalam-minggu 1 sampai 5 (Senin sampai Jumat). Hasilnya: 9:30 pagi setiap hari kerja.

Field 1: Menit (0–59)

Field menit menentukan menit mana dalam satu jam job harus dijalankan. 0 berarti awal jam, 30 berarti setengah jam lewat, 59 berarti satu menit sebelum jam berganti. Menggunakan * menjalankan job setiap menit.

Field 2: Jam (0–23)

Jam menggunakan waktu 24-jam. 0 adalah tengah malam, 12 adalah tengah hari, 23 adalah 11:00 malam. Tidak ada AM/PM di cron — job pukul 9:00 pagi adalah jam 9, dan job pukul 9:00 malam adalah jam 21.

Field 3: Hari dalam Bulan (1–31)

Tidak seperti field lain, hari-dalam-bulan dimulai dari 1, bukan 0. Nilai valid adalah 1 sampai 31. Jika Anda menentukan hari yang tidak ada di bulan tertentu (misalnya, hari 31 di bulan April), job sederhananya tidak berjalan di bulan itu. Di Quartz, karakter khusus L mewakili hari terakhir bulan, terlepas dari berapa hari di dalamnya.

Field 4: Bulan (1–12)

Nilai bulan berjalan dari 1 (Januari) sampai 12 (Desember). Banyak scheduler juga menerima singkatan tiga huruf: JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC. Ini tidak peka huruf besar/kecil di sebagian besar implementasi.

Field 5: Hari dalam Minggu (0–7)

Ini adalah field dengan beban historis terbanyak. Baik 0 dan 7 mewakili Minggu — ini adalah keanehan kompatibilitas dari awal Unix. Senin adalah 1, Selasa 2, sampai Sabtu 6. Nama tiga huruf juga berfungsi di sini: SUN, MON, TUE, WED, THU, FRI, SAT.

Saat baik hari-dalam-bulan maupun hari-dalam-minggu ditentukan (tidak ada yang *), sebagian besar daemon cron Unix menggunakan logika OR: job berjalan jika cocok dengan salah satu field. Ini mengejutkan banyak developer. Jika Anda ingin "tanggal 15, tetapi hanya jika hari kerja," Anda perlu menangani itu dalam skrip job sendiri, bukan dalam ekspresi cron.

Karakter Khusus

Tanda Bintang (*) — Setiap Nilai

Tanda bintang cocok dengan setiap nilai valid untuk sebuah field. Di field menit, * berarti menit 0 sampai 59. Di field bulan, ia berarti semua 12 bulan. Ini adalah karakter paling umum dalam ekspresi cron.

Garis Miring (/) — Nilai Langkah

Garis miring mendefinisikan interval langkah. */5 di field menit berarti "setiap 5 menit." Lebih tepatnya, ia berarti "setiap nilai dalam rentang yang habis dibagi 5 dimulai dari nilai pertama dalam rentang." Jadi */5 dalam menit dievaluasi menjadi 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55.

Langkah dapat digabungkan dengan rentang: 10-30/5 di field menit berarti setiap 5 menit antara menit 10 dan menit 30, menghasilkan 10, 15, 20, 25, 30. Langkah dimulai dari batas bawah rentang.

Koma (,) — Daftar Nilai

Koma membuat daftar nilai tertentu. 1,3,5 di field bulan berarti Januari, Maret, dan Mei. 9,17 di field jam berarti 9:00 dan 17:00. Anda dapat mendaftar nilai sebanyak yang dibutuhkan dan menggabungkannya dengan konstruksi lain.

Tanda Hubung (-) — Rentang

Tanda hubung menentukan rentang inklusif. 1-5 di field hari-dalam-minggu berarti Senin sampai Jumat. 9-17 di field jam berarti 9 pagi sampai 5 sore. Rentang inklusif di kedua ujung.

Tanda Tanya (?) — Tidak Ada Nilai Spesifik (Hanya Quartz)

Cron Unix standar tidak mendukung ?. Di Quartz Scheduler, ia digunakan di field hari-dalam-bulan atau hari-dalam-minggu untuk berarti "Saya tidak peduli tentang field ini." Karena Quartz tidak selalu dapat menyelesaikan konflik antara hari-dalam-bulan dan hari-dalam-minggu, salah satu dari keduanya harus diatur ke ? saat yang lain ditentukan. 0 0 15 * ? berarti "tanggal 15 setiap bulan, hari mana pun dalam minggu." 0 0 ? * MON berarti "setiap Senin, hari mana pun dalam bulan."

L — Last (Hanya Quartz)

L di field hari-dalam-bulan berarti hari terakhir bulan. L di field hari-dalam-minggu berarti Sabtu, atau saat digabungkan dengan angka (misalnya, 5L), kemunculan terakhir hari kerja itu dalam bulan. 5L adalah Jumat terakhir bulan ini.

W — Hari Kerja Terdekat (Hanya Quartz)

W di field hari-dalam-bulan menemukan hari kerja terdekat (Senin–Jumat) ke hari yang diberikan. 15W berarti hari kerja terdekat ke tanggal 15. Jika tanggal 15 adalah Sabtu, job berjalan pada tanggal 14 (Jumat). Jika itu adalah Minggu, ia berjalan pada tanggal 16 (Senin). W tidak melintasi batas bulan.

Hash (#) — Hari Kerja ke-N dari Bulan (Hanya Quartz)

# menentukan kemunculan ke-N dari hari kerja dalam bulan. 5#2 berarti Jumat kedua dari bulan. 2#1 berarti Selasa pertama. Jika kemunculan yang ditentukan tidak ada di bulan tertentu, job tidak berjalan di bulan itu.

Pola Cron Umum

# Setiap menit
* * * * *

# Setiap hari pada tengah malam (00:00)
0 0 * * *

# Setiap hari pukul 9:30 pagi
30 9 * * *

# Setiap Senin pukul 8:00 pagi
0 8 * * 1

# Tanggal 1 setiap bulan pada tengah hari
0 12 1 * *

# Setiap 15 menit
*/15 * * * *

# Hari kerja pukul 6:00 sore
0 18 * * 1-5

Anda dapat menguji dan memvalidasi ini menggunakan alat Cron Parser, yang menampilkan lima waktu eksekusi berikutnya untuk ekspresi apa pun dan menyorot sintaks tidak valid. Gunakan Timestamp Converter jika Anda perlu memverifikasi apa yang sesuai dengan timestamp Unix tertentu di zona waktu lokal Anda.

Ekstensi 6-Field: Quartz Scheduler

Quartz Scheduler — digunakan secara luas di ekosistem Java dan diadopsi oleh banyak scheduler enterprise — menambahkan field detik wajib di awal ekspresi. Formatnya menjadi: detik menit jam hari-dalam-bulan bulan hari-dalam-minggu.

# Quartz 6-field: detik menit jam hari bulan hari-minggu
# Berjalan tepat pada 00 detik, 30 menit, setiap jam
0 30 * * * ?

# Berjalan pada tengah malam setiap hari
0 0 0 * * ?

# Berjalan setiap 5 detik
0/5 * * * * ?

# Hari terakhir bulan pukul 10:00 pagi
0 0 10 L * ?

# Jumat terakhir bulan pukul 3:00 sore
0 0 15 ? * 6L

Perbedaan utama dari cron standar: field detik (0–59) adalah yang pertama dan wajib; hari-dalam-minggu menggunakan 1 (Minggu) sampai 7 (Sabtu), bukan 0–6; ? diperlukan di hari-dalam-bulan atau hari-dalam-minggu saat yang lain ditentukan; dan L, W, serta # adalah karakter khusus yang valid.

Jangan pernah menempel ekspresi Quartz ke crontab Unix tanpa menghapus field detik dan menyesuaikan penomoran hari-dalam-minggu. Parser tidak dapat dipertukarkan.

Cron di Sistem Berbeda

crontab Linux/Unix (Vixie cron)

Bentuk asli dan paling umum. Lima field, dipisahkan spasi, diikuti perintah. Variabel lingkungan seperti CRON_TZ atau TZ mengatur zona waktu. Crontab pengguna diedit dengan crontab -e; crontab sistem berada di /etc/cron.d/. Shortcut @reboot, @daily, @hourly, @weekly, dan @monthly didukung secara luas sebagai alias untuk pola umum.

GitHub Actions

GitHub Actions menggunakan sintaks cron 5-field standar, tetapi zona waktu selalu UTC — tidak ada cara untuk menentukan zona waktu lokal dalam ekspresi itu sendiri. Ekspresi dievaluasi pada tingkat repositori, bukan per job. Perhatikan bahwa workflow terjadwal dapat tertunda beberapa menit selama periode beban tinggi di infrastruktur GitHub.

# Sintaks schedule GitHub Actions (hanya UTC 5-field)
on:
  schedule:
    # Berjalan setiap hari pada 02:30 UTC
    - cron: '30 2 * * *'
    # Berjalan setiap Senin pada 09:00 UTC
    - cron: '0 9 * * 1'

Dokumentasi cron GitHub Actions resmi mencatat bahwa interval minimum adalah 5 menit — ekspresi yang akan berjalan lebih sering dari itu diabaikan secara diam-diam.

AWS EventBridge (CloudWatch Events)

AWS EventBridge mendukung ekspresi rate (rate(5 minutes)) dan ekspresi cron. Varian cron mereka adalah 6-field tetapi berbeda dari Quartz: hari-dalam-minggu menggunakan nama Sun–Sat atau 1–7 di mana 1 adalah Minggu, semua waktu adalah UTC, dan setidaknya satu dari hari-dalam-bulan atau hari-dalam-minggu harus ?. AWS tidak mendukung karakter W atau #.

# AWS EventBridge (cron dalam UTC, varian 6-field)
# Berjalan setiap hari pukul 10:00 pagi UTC
cron(0 10 * * ? *)

# Berjalan pukul 6:00 sore pada hari kerja terakhir setiap bulan
cron(0 18 L-1 * ? *)

Kubernetes CronJob

Kubernetes CronJob menggunakan sintaks cron 5-field standar. Zona waktu default ke zona waktu proses kube-controller-manager (biasanya UTC di cluster terkelola). Kubernetes 1.25 menambahkan field timeZone ke spec CronJob, memungkinkan konfigurasi zona waktu per-job tanpa mengandalkan zona waktu sistem.

Node.js (node-cron / cron npm)

Paket node-cron yang populer mendukung ekspresi 5-field standar plus field detik ke-6 opsional yang ditambahkan di depan. Paket cron kompatibel dengan Quartz. Keduanya mendukung string zona waktu (misalnya, America/New_York) sebagai opsi konstruktor. Periksa dokumentasi paket spesifik Anda untuk mengonfirmasi format mana yang diharapkannya.

Jebakan Umum

Asumsi zona waktu

Cron berjalan di zona waktu server atau kontainer, yang sering UTC di lingkungan cloud. Job yang dimaksudkan untuk berjalan pada "jam 9 pagi waktu bisnis" yang diatur sebagai 0 9 * * * akan berjalan pada jam 9 pagi UTC — yang bisa menjadi jam 4 pagi, jam 5 pagi, atau jam 11 pagi di zona waktu lokal Anda tergantung pada offset dan DST. Selalu atur CRON_TZ, gunakan field zona waktu scheduler, atau konversi waktu target Anda ke UTC secara eksplisit. Timezone Converter dapat membantu Anda menemukan ekuivalen UTC untuk waktu lokal apa pun di zona waktu mana pun.

Logika OR hari-dalam-bulan / hari-dalam-minggu

Di cron Unix, saat baik field hari-dalam-bulan maupun hari-dalam-minggu adalah non-*, daemon menjalankan job jika salah satu cocok. Jadi 0 9 15 * 1 berjalan pada tanggal 15 setiap bulan DAN setiap Senin — bukan hanya pada Senin yang kebetulan tanggal 15. Untuk mencapai logika AND, Anda harus menerapkan pemeriksaan tambahan di dalam skrip job.

Membingungkan nilai langkah dengan rentang

*/5 berarti "setiap 5 menit dimulai dari 0" (0, 5, 10 ...). 5/5 berarti "setiap 5 menit dimulai dari 5" (5, 10, 15 ...). 5-30/5 berarti "setiap 5 menit antara menit 5 dan menit 30" (5, 10, 15, 20, 25, 30). Mencampur ini dengan rentang dapat menghasilkan hasil tak terduga jika Anda tidak sengaja tentang nilai awal.

Jebakan "setiap detik"

Resolusi minimum cron dalam format 5-field standar adalah satu menit. Anda tidak dapat menjadwalkan job cron berjalan setiap detik atau setiap beberapa detik menggunakan crontab. Untuk penjadwalan sub-menit, gunakan timer tingkat-bahasa (setInterval di Node.js, APScheduler di Python) atau sistem antrean yang dibangun khusus daripada cron. Jika Anda perlu setiap 30 detik, jalankan dua job cron: satu pada * * * * * dan satu yang tidur 30 detik sebelum eksekusi.

Melewatkan penomoran bulan

Di cron standar, bulan berjalan dari 1 (Januari) sampai 12 (Desember). Di beberapa API tanggal bahasa pemrograman, bulan berbasis-0 (0 = Januari, 11 = Desember). Jika Anda menghasilkan ekspresi cron secara programatik dari objek tanggal, periksa ganda bahwa Anda tidak salah satu di field bulan.

Validasi Ekspresi Anda

Cron Parser di Toova menampilkan lima waktu eksekusi terjadwal berikutnya untuk ekspresi apa pun, mendukung sintaks Quartz 5-field dan 6-field, dan menandai nilai tidak valid inline. Untuk pemeriksaan kewarasan cepat, crontab.guru adalah alat interaktif yang terkenal yang mendeskripsikan ekspresi dalam bahasa Inggris biasa. Keduanya berguna untuk ditandai.

Saat bekerja dengan timestamp dan waktu terjadwal, Timestamp Converter menerjemahkan antara timestamp Unix dan tanggal yang dapat dibaca manusia di zona waktu mana pun. Untuk job yang melibatkan penjadwalan sensitif zona waktu, pasangkan dengan Timezone Converter untuk memverifikasi offset, transisi DST, dan ekuivalen UTC sebelum menulis ekspresi akhir Anda.