Penjelas ekspresi cron

Menjelaskan ekspresi cron apa pun — Vixie, Quartz, EventBridge, atau Jenkins — mendaftar jalannya berikutnya di zona waktu mana pun, dan menandai jebakan.

Masukan

Dibaca sebagai Vixie cron.

Apa artinya

Pada 00:00 pada hari-dalam-bulan 13 atau pada Jumat

Bidang demi bidang

BidangDitulisCocok
Menit00
Jam00
Hari dalam bulan1313
Bulan*setiap nilai
Hari dalam minggu5Jumat

Yang perlu diwaspadai

  • Kedua bidang hari dibatasi, jadi cron menjalankan ini ketika salah satu cocok — hari dalam bulan atau hari dalam minggu, bukan keduanya bersama. Itulah sebabnya 13 dengan Jumat berarti tanggal 13 dan setiap Jumat, bukan Jumat tanggal 13.

Jalan berikutnya

    Apa yang dilakukan alat ini

    Ia membaca sebuah ekspresi cron kembali kepada Anda dalam kata-kata, mendaftar waktu berikutnya ia akan benar-benar memicu dalam zona waktu mana pun tempat pekerjaan berjalan, dan menyebut hal yang disiratkan ekspresi tetapi tak dikatakannya. Bagian terakhir itu adalah intinya: sebuah ekspresi cron tak pernah salah dengan cara yang menghasilkan sebuah galat. Ia berjalan pada hari yang salah, diam-diam, sampai seseorang menyadari.

    Empat dialek dipahami ketimbang satu. Bentuk lima-bidang yang diambil crontab, Quartz dengan bidang detiknya dan aturan kalendernya, AWS EventBridge dengan sebuah tahun di ujung, dan Jenkins dengan hash-nya. Menempel satu ke sebuah alat yang hanya tahu yang lain adalah bagaimana kebanyakan orang pertama menemukan ada lebih dari satu.

    Bidang, dan berapa banyak darinya yang ada

    Ekspresi klasik punya lima bidang, dipisah spasi, dalam urutan tetap: menit, jam, hari dalam bulan, bulan, hari dalam minggu. Masing-masing entah sebuah bintang yang berarti "setiap", sebuah angka, sebuah daftar yang dipisah koma, sebuah rentang dengan sebuah tanda hubung, atau sebuah langkah dengan sebuah garis miring. Bulan dan hari boleh ditulis sebagai nama tiga-huruf, yang hampir selalu lebih jelas daripada digitnya.

    • Sebuah bintang berarti setiap nilai yang bisa diambil bidang.
    • Sebuah rentang seperti 9-17 berarti setiap nilai dari 9 sampai 17 inklusif.
    • Sebuah langkah seperti */15 berarti setiap nilai ke-15 mulai dari dasar bidang; 9-17/2 melangkah di dalam sebuah rentang, dan 5/15 melangkah dari 5 ke puncak.
    • Sebuah daftar seperti 0,30 berarti persis nilai itu.
    • Sebuah rentang degeneratif seperti 13-13 cukup 13 — beberapa pustaka salah tentang ini dan memperlakukannya sebagai sebuah bintang.

    Sebuah bidang keenam adalah tempat dialek berpisah. Quartz menaruhnya di depan dan membacanya sebagai detik; EventBridge menaruhnya di ujung dan membacanya sebagai sebuah tahun. Enam bidang telanjang karenanya benar-benar ambigu, dan alat ini mengatakan dengan cara mana ia membacanya ketimbang memilih senyap. Membungkus ekspresi dalam cron(...) — sintaksis EventBridge sendiri — menyelesaikannya.

    Makro adalah singkatan: @hourly, @daily, @midnight, @weekly, @monthly, @yearly, dan @annually. Mereka mengembang ke ekspresi biasa, yang ditampilkan alat. @reboot adalah yang ganjil dan bukan sebuah jadwal sama sekali.

    Kedua bidang hari, dan "atau" yang tampak seperti "dan"

    Sebuah tanggal bisa dipilih dua cara berbeda — dengan hari dalam bulan dan dengan hari dalam minggu — dan cron punya kedua bidang. Ketika keduanya dibatasi, pekerjaan berjalan ketika salah satu cocok. Bukan keduanya.

    Jadi 0 0 13 * 5 bukan Jumat tanggal 13. Ia adalah tanggal 13 setiap bulan, dan setiap Jumat: sekitar 64 hari setahun alih-alih satu atau dua. Ekspresi tampak seperti sebuah konjungsi dan berperilaku seperti sebuah disjungsi, tak ada yang melaporkan sebuah galat, dan pekerjaan cukup berjalan lebih sering daripada yang dimaksudkan.

    Aturan punya separuh kedua yang lebih aneh, dan itu yang hampir tak ada yang tahu. Cron tak menguji apakah sebuah bidang hari dibatasi; ia menguji apakah karakter pertama bidang adalah sebuah bintang. Jadi sebuah langkah seperti */14 dihitung sebagai sebuah bintang meski ia membatasi bidang ke tanggal 1, 15, dan 29 — dan kehadirannya membalik kedua bidang hari dari "atau" kembali ke "dan". Dua ekspresi yang tampak sama-sama dibatasi lalu berperilaku sepenuhnya berbeda, dan alat ini melaporkan aturan mana yang berlaku.

    Quartz dan EventBridge menghindari seluruh pertanyaan dengan menolak membiarkan kedua bidang mengatakan sesuatu: persis satu dari mereka harus berupa sebuah tanda tanya, yang berarti "tanpa nilai spesifik, bidang lain memutuskan".

    Langkah yang tak membagi bidangnya

    Sebuah langkah ditulis seolah ia adalah sebuah interval, dan di dalam satu siklus bidang ia begitu. Melintasi batas biasanya ia tidak.

    */7 dalam bidang jam berarti jam 0, 7, 14, dan 21. Setelah 21 bidang kehabisan, jadi jalan berikutnya adalah pada 0 hari berikutnya — tiga jam kemudian, bukan tujuh. Setiap siklus diakhiri dengan satu jeda pendek, dan hal yang sama terjadi dengan */7 dalam menit (sebuah jeda empat-menit setelah 56) dan langkah lain mana pun yang tak membagi rentangnya secara rata. */15 dalam menit dan */6 dalam jam aman; kebanyakan angka yang orang raih tidak.

    Ini penting ketika langkah dipilih untuk menyebar pekerjaan. Sebuah pekerjaan pada */7 jam tak berjalan setiap tujuh jam, dan sebuah batas laju yang berukuran untuk tujuh akan dilanggar sekali sehari.

    Hari dalam minggu dinomori berbeda di tempat berbeda

    Vixie cron menomori hari 0 sampai 7 dengan Minggu di kedua ujung, jadi 0 dan 7 adalah hari yang sama dan 1 adalah Senin. Quartz dan EventBridge menomorinya 1 sampai 7 dengan Minggu di 1, jadi di sana 1 adalah Minggu dan 2 adalah Senin.

    Sebuah ekspresi yang disalin dari sebuah konfigurasi Quartz ke sebuah crontab karenanya berjalan sehari lebih awal, dan tak ada di mana pun yang mengeluh, karena kedua ejaan adalah angka yang valid di kedua sistem. Nama tiga-huruf — MON, FRI — berarti hari yang sama di mana-mana dan adalah pertahanan sederhananya.

    Waktu musim panas: dua pagi setahun

    Sebuah daemon cron tak menjadwalkan saat. Ia melihat jam-dinding lokal tiap menit dan bertanya apakah ekspresi cocok. Dua kali setahun jam itu bukan sebuah urutan yang berperilaku baik.

    Ketika ia melompat maju, sejam pembacaan tak pernah terjadi. Sebuah pekerjaan yang diatur untuk 02:30 tak punya 02:30 hari itu. Ketika ia mundur, sejam pembacaan terjadi dua kali, dan sebuah pekerjaan yang diatur untuk 01:30 punya dua darinya.

    Vixie cron membedakan dua jenis pekerjaan di sini, dan perbedaannya layak diketahui karena ia memutuskan mana dari pekerjaan Anda yang terpengaruh. Sebuah pekerjaan yang dipaku ke waktu jam-dinding — sebuah jam tetap dan sebuah menit tetap — dijalankan persis sekali dengan cara apa pun: setelah sebuah lompatan maju ia berjalan segera, dan setelah yang mundur cron menjaga agar tak mengulanginya. Sebuah pekerjaan dengan sebuah bintang dalam jam atau menit adalah sebuah pekerjaan interval, dan ia cukup mengikuti jam: ia kehilangan sejam jalannya di musim semi dan mengulang sejam darinya di musim gugur.

    Jadi sebuah cadangan tiap jam memang berjalan dua kali pada satu malam setahun, dan sebuah pekerjaan malam pada 02:30 memang berjalan pada sebuah saat tak biasa pada yang lain. Alat ini memeriksa dua belas bulan berikutnya dari zona yang dipilih terhadap ekspresi Anda dan mengatakan mana dari keduanya yang berlaku, dengan tanggalnya.

    Jalan keluar yang andal adalah menjadwalkan pekerjaan dalam UTC, atau di luar 01:00–03:00 lokal, tempat tak ada transisi mendarat.

    Jam mana pekerjaan sebenarnya berada

    Sebuah crontab berjalan pada zona lokal mesin, atau pada apa pun yang dikatakan CRON_TZ atau TZ di puncak berkas. Itu jarang zona orang yang membaca ekspresi, itulah sebabnya zona waktu di sini adalah sebuah setelan ketimbang milik browser Anda.

    Sebuah CronJob Kubernetes berbeda lagi: ia membaca jadwalnya dalam UTC kecuali manifes mengatur sebuah bidang timeZone, apa pun yang dikatakan jam node sendiri. Sebuah jadwal yang ditulis untuk jam kerja lokal dan diterapkan tanpa bidang itu berjalan pada waktu yang salah di hari di mana pun di luar UTC — dan tak berubah dengan musim, yang entah sebuah bug atau sebuah kelegaan bergantung pada pekerjaan.

    Jenkins dan H

    Jenkins menambah sebuah token yang tak dimiliki dialek lain: H, yang tampak seperti keacakan dan bukan. Jenkins meng-hash nama pekerjaan menjadi sebuah nilai tetap di dalam rentang bidang, jadi pekerjaan berjalan pada waktu yang sama setiap hari — waktunya sendiri — sementara seratus pekerjaan yang ditulis H * * * * menyebarkan diri secara merata di seluruh jam alih-alih semua memulai pada menitnya.

    Karena nilainya datang dari nama pekerjaan, dan nama pekerjaan bukan bagian dari ekspresi, tak ada alat yang bisa menghitung waktu pastinya. Yang ini menyelesaikan setiap H ke dasar rentangnya dan mengatakannya: bentuk jadwal — seberapa sering, pada hari mana — persis, dan hanya offset di dalam tiap periode yang menjadi pengganti.

    Jenkins juga mendefinisikan ulang makro. @daily-nya adalah @midnight, yang bukan tengah malam melainkan sebuah menit ter-hash di suatu tempat dalam tiga jam pertama hari itu.

    Apa yang tak dilakukan cron

    • Ia tak mengejar ketinggalan. Jika mesin tidur atau daemon mati ketika sebuah jalan jatuh tempo, jalan itu tak terjadi kemudian — ia cukup terlewat. anacron ada persis untuk ini dan adalah program yang berbeda.
    • Ia tak menghentikan jalan yang tumpang-tindih. Jika sebuah pekerjaan memakan lebih lama daripada intervalnya, yang berikutnya mulai tetap saja, dan setelah beberapa saat ada beberapa. Sebuah berkas kunci adalah jawaban biasanya.
    • Ia tak punya gagasan tentang detik dalam bentuk klasik. Resolusi terhalus adalah satu menit; apa pun yang lebih cepat butuh Quartz, systemd, atau sebuah gelung di dalam pekerjaan.
    • @reboot bukan sebuah jadwal. Ia berjalan sekali ketika daemon dimulai, jadi ia tak punya jalan berikutnya, dan pada sebuah mesin yang tak pernah reboot ia tak pernah berjalan sama sekali.
    • Sebuah ekspresi rate dalam EventBridge menghitung dari kapan aturan dibuat, dan saat itu bukan dalam ekspresi, jadi tak ada alat yang bisa mengatakan kapan ia memicu berikutnya.

    Pertanyaan yang sering diajukan

    Bagaimana saya menjalankan sebuah pekerjaan pada Senin pertama bulan?
    Tak dengan sebuah ekspresi cron polos — itu butuh sebuah "dan" antara kedua bidang hari, dan cron memberi Anda sebuah "atau". Solusi standarnya adalah menjadwalkan 0 0 1-7 * * dan meminta perintah menguji hari kerjanya sendiri. Quartz dan EventBridge bisa mengungkapkannya langsung, sebagai 0 0 12 ? * MON#1.
    Mengapa 0 0 13 * 5 berjalan begitu sering?
    Karena ia berarti tanggal 13 atau setiap Jumat, bukan Jumat tanggal 13. Ketika kedua bidang hari dibatasi dan tak satu pun diawali sebuah bintang, cron menjalankan pekerjaan ketika salah satu cocok. Tak ada cara menulis sebuah "dan" dalam dialek klasik.
    Apa perbedaan antara */5 dan 0-59/5?
    Tak ada, untuk bidang menit: keduanya memberi 0, 5, 10, dan seterusnya. Perbedaannya muncul dalam kedua bidang hari, tempat cron memutuskan antara "dan" dan "atau" dengan melihat apakah bidang diawali sebuah bintang — jadi */5 dan 0-59/5 memilih hari yang sama tetapi bergabung dengan bidang hari lain secara berbeda.
    Apakah pekerjaan saya berjalan dua kali ketika jam mundur?
    Jika ia punya sebuah bintang dalam jam atau menit, ya: ia mengikuti jam, dan jam itu terjadi dua kali. Jika ia punya sebuah jam dan menit tetap, tidak — Vixie cron menjalankan pekerjaan seperti itu sekali. Panel temuan mengatakan kasus mana milik Anda, dengan tanggal yang berlaku.
    Zona waktu mana yang dipakai sebuah ekspresi cron?
    Milik mesin, kecuali CRON_TZ atau TZ diatur dalam crontab. Sebuah CronJob Kubernetes memakai UTC kecuali manifes mengatur timeZone. Karena zona bukan bagian dari ekspresi, alat ini memintanya ketimbang mengasumsikan milik browser Anda.
    Bisakah saya menjadwalkan sesuatu setiap 90 menit?
    Tak sebagai satu ekspresi, karena tiap bidang berputar secara mandiri dan 90 menit tak pas ke dalam sebuah jam. Ejaan biasanya adalah dua ekspresi, 0 0,3,6,9,12,15,18,21 * * * dan 30 1,4,7,10,13,16,19,22 * * *, yang bersama memberi sebuah jalan setiap 90 menit.
    Apakah ada yang saya tempel dikirim ke server?
    Tidak. Penguraian, penjelasan, dan seluruh perhitungan jadwal berjalan di browser Anda; tak ada yang diunggah atau dicatat, dan ia bekerja tanpa koneksi jaringan.