Crontab Guru

Tempel ekspresi cron dan dapatkan penjelasan bidang demi bidang, dalam bahasa Inggris sederhana, tentang apa yang dilakukannya. Tidak perlu mengingat urutan field atau mencari tahu rentangnya: guru membahas masing-masing dari lima bidang (menit, jam, hari-dalam-bulan, bulan, dan hari-dalam-minggu) dan membaca ekspresi dari kiri ke kanan. Berguna untuk memeriksa baris crontab sebelum men-deploy-nya, atau untuk menjelaskan baris yang Anda warisi.

Cara menggunakan guru

  1. 1

    Tempel ekspresi

    Salin ekspresi cron standar 5 bidang apa pun (misalnya `0 9 * * 1-5`) ke kolom input.

  2. 2

    Minta penjelasan

    Klik Explain Cron dan tool mengembalikan deskripsi baris demi baris untuk tiap bidang: menit, jam, hari-dalam-bulan, bulan, dan hari-dalam-minggu.

  3. 3

    Baca deskripsinya

    Penjelasan dihasilkan dalam bahasa Inggris, misalnya "Minute: every 5 minutes" atau "Hour: from 9 through 17."

  4. 4

    Periksa sebelum men-deploy

    Gunakan penjelasan untuk memastikan jadwal melakukan yang Anda inginkan sebelum memasukkannya ke crontab, konfigurasi CI, atau manifest Kubernetes.

Lembar contekan field

 ┌───────────── menit (0-59)
 │ ┌─────────── jam (0-23)
 │ │ ┌───────── hari dalam bulan (1-31)
 │ │ │ ┌─────── bulan (1-12 atau JAN-DEC)
 │ │ │ │ ┌───── hari dalam minggu (0-6 atau SUN-SAT; Min = 0 atau 7)
 │ │ │ │ │
 * * * * *

Operator dalam ekspresi cron

Operator Arti Contoh
* Setiap nilai * * * * *
, Daftar nilai 0,15,30,45
- Rentang 9-17
/ Step (mulai/step) */5, 0-30/5
L Terakhir (hari terakhir dalam bulan atau hari kerja terakhir yang cocok, Quartz) L, 5L
W Hari kerja terdekat 15W (Quartz)
# Hari yang cocok ke-N dalam bulan 1#3 (Quartz)
? Tanpa nilai spesifik Hanya Quartz

Urutan baca penting

0 */2 * * 1-5 dibaca kiri ke kanan sebagai: menit 0, setiap 2 jam, hari mana pun dalam bulan, bulan mana pun, Senin sampai Jumat. Orang kadang membaca field kanan-ke-kiri karena kebiasaan dan jadi bingung; selalu mulai dari menit.

Jebakan “setiap X menit”

*/10 * * * * berjalan pada menit 0, 10, 20, 30, 40, 50, bukan “setiap 10 menit sejak job dibuat.” Step cron selalu diukur dari awal rentang field. Jika Anda men-deploy job pada 12:03, run pertama adalah 12:10, bukan 12:13.

Untuk job yang benar-benar butuh “N menit setelah run terakhir,” gunakan scheduler dengan timer persisten (systemd timer dengan OnUnitActiveSec, atau penjadwalan tingkat aplikasi dengan timestamp last-run yang tersimpan).

Jebakan cron yang perlu diketahui

  • Hari-dalam-bulan + hari-dalam-minggu keduanya diatur: sebagian besar implementasi cron menganggap ini perilaku OR, kemungkinan bukan yang Anda inginkan.
  • Step 0: */0 tidak valid.
  • Rentang melewati tengah malam: 22-2 untuk jam tidak berfungsi di cron klasik; gunakan 22-23,0-2.
  • 30 Februari: jadwal seperti 0 0 30 2 * tak pernah berjalan.
  • Ambiguitas DST: job yang dijadwalkan antara jam 2 dan 3 pagi mungkin berjalan dua kali atau nol kali pada hari transisi DST.

Cron vs. scheduler modern

Unix cron masih ada di mana-mana, tetapi untuk apa pun yang kritis Anda mungkin ingin:

  • systemd timers: menangkap run yang terlewat, mendukung offset acak, membaca dari unit file.
  • Kubernetes CronJob: deklaratif, retries, sadar timezone di 1.25+.
  • Airflow / Prefect / Dagster: untuk job dengan dependensi, retries, backfill, observability.
  • GitHub Actions schedule: cron 5-field, UTC saja, interval minimum 5 menit, pengiriman best-effort.

Cron sendiri adalah format yang bagus, tetapi scheduler yang buruk untuk job yang tidak boleh terlewat.

Pertanyaan yang Sering Diajukan

Karena hari-dalam-minggu 0 adalah Minggu di cron standar (dan 7 juga Minggu, mendukung kedua konvensi). Senin adalah 1. Quartz menomori hari 1-7 dengan Minggu = 1, yang sering membingungkan orang yang berpindah antar implementasi.

Unix cron klasik berjalan di timezone lokal server, apa pun yang tertulis di /etc/timezone. Kubernetes CronJob, GitHub Actions, dan sebagian besar scheduler cloud berjalan di UTC secara default. Selalu konfirmasikan dan, bila memungkinkan, gunakan UTC untuk menghindari kejutan DST.

Cron klasik tidak bisa mengekspresikan ini secara langsung. Solusi: jalankan setiap Senin dan periksa tanggal di dalam skrip: [ $(date +%d) -le 7 ] && ./job.sh. Quartz mendukungnya secara native dengan 1#1.

Tidak. Setiap jadwal butuh barisnya sendiri. Tetapi Anda bisa menggabungkan beberapa jadwal dalam satu baris dengan daftar: 0 9,17 * * * berjalan pukul 9 pagi dan 5 sore. Untuk jadwal yang tidak bisa diekspresikan sebagai satu baris, tambahkan beberapa baris yang mengarah ke perintah yang sama.

Alat Terkait