Penjelas ekspresi cron
Menjelaskan ekspresi cron apa pun — Vixie, Quartz, EventBridge, atau Jenkins — mendaftar jalannya berikutnya di zona waktu mana pun, dan menandai jebakan.
Dibaca sebagai Vixie cron.
Apa artinya
Pada 00:00 pada hari-dalam-bulan 13 atau pada Jumat
Bidang demi bidang
| Bidang | Ditulis | Cocok |
|---|---|---|
| Menit | 0 | 0 |
| Jam | 0 | 0 |
| Hari dalam bulan | 13 | 13 |
| Bulan | * | setiap nilai |
| Hari dalam minggu | 5 | Jumat |
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 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: ekspresi cron tak pernah salah dengan cara yang menghasilkan galat. Ia berjalan pada hari yang salah, diam-diam, sampai seseorang menyadari.
Empat dialek dipahami ketimbang satu. Bentuk lima bidang yang diterima crontab, Quartz dengan bidang detiknya dan aturan kalendernya, AWS EventBridge dengan tahun di ujung, dan Jenkins dengan hash-nya. Menempel satu ke alat yang hanya tahu yang lain adalah cara kebanyakan orang pertama kali 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 bintang yang berarti "setiap", angka, daftar yang dipisah koma, rentang dengan tanda hubung, atau langkah dengan garis miring. Bulan dan hari boleh ditulis sebagai nama tiga huruf, yang hampir selalu lebih jelas daripada digitnya.
- Bintang berarti setiap nilai yang bisa diambil bidang.
- Rentang seperti 9-17 berarti setiap nilai dari 9 sampai 17 inklusif.
- Langkah seperti */15 berarti setiap nilai ke-15 mulai dari dasar bidang; 9-17/2 melangkah di dalam rentang, dan 5/15 melangkah dari 5 ke puncak.
- Daftar seperti 0,30 berarti persis nilai itu.
- Rentang degenerat seperti 13-13 cukup 13 — beberapa pustaka keliru soal ini dan memperlakukannya sebagai bintang.
Bidang keenam adalah tempat dialek berpisah. Quartz menaruhnya di depan dan membacanya sebagai detik; EventBridge menaruhnya di ujung dan membacanya sebagai tahun. Enam bidang polos karenanya benar-benar ambigu, dan alat ini mengatakan dengan cara mana ia membacanya ketimbang memilih diam-diam. 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 jadwal sama sekali.
Kedua bidang hari, dan "atau" yang tampak seperti "dan"
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 konjungsi dan berperilaku seperti disjungsi, tak ada yang melaporkan 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 bidang hari dibatasi; ia menguji apakah karakter pertama bidang adalah bintang. Jadi langkah seperti */14 dihitung sebagai 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 tanda tanya, yang berarti "tanpa nilai spesifik, bidang lain memutuskan".
Langkah yang tak membagi bidangnya
Langkah ditulis seolah ia adalah 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 itu habis, 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 (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 menyebarkan pekerjaan. Pekerjaan pada */7 jam tak berjalan setiap tujuh jam, dan batas laju yang dihitung 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.
Ekspresi yang disalin dari konfigurasi Quartz ke 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
Daemon cron tak menjadwalkan saat. Ia melihat jam-dinding lokal tiap menit dan bertanya apakah ekspresi cocok. Dua kali setahun jam itu bukan urutan yang berperilaku baik.
Ketika ia melompat maju, sejam pembacaan tak pernah terjadi. Pekerjaan yang diatur untuk 02:30 tak punya 02:30 hari itu. Ketika ia mundur, sejam pembacaan terjadi dua kali, dan 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. Pekerjaan yang dipaku ke waktu jam-dinding — jam tetap dan menit tetap — dijalankan persis sekali dalam kedua kasus: setelah lompatan maju ia berjalan segera, dan setelah yang mundur cron menjaga agar tak mengulanginya. Pekerjaan dengan bintang dalam jam atau menit adalah pekerjaan interval, dan ia cukup mengikuti jam: ia kehilangan sejam jalannya di musim semi dan mengulang sejam darinya di musim gugur.
Jadi cadangan tiap jam memang berjalan dua kali pada satu malam setahun, dan pekerjaan malam pada 02:30 memang berjalan pada 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, tempat tak ada yang bergeser. Kalau tidak, jauhkan pekerjaan dari dini hari, sebab di situlah zona menaruh transisinya: jam persisnya milik zona itu sendiri dan tidak sama di mana-mana, jadi bacalah tanggal yang dilaporkan alat ini untuk zona yang dipilih alih-alih mengandaikan jendela tetap.
Jam mana pekerjaan sebenarnya berada
Crontab berjalan pada zona lokal mesin, atau pada apa pun yang dikatakan CRON_TZ atau TZ di bagian atas berkas. Itu jarang zona orang yang membaca ekspresi, itulah sebabnya zona waktu di sini adalah setelan ketimbang milik peramban Anda.
CronJob Kubernetes berbeda lagi: ia membaca jadwalnya dalam UTC kecuali manifes mengatur bidang timeZone, apa pun yang dikatakan jam node sendiri. Jadwal yang ditulis untuk jam kerja lokal dan diterapkan tanpa bidang itu berjalan pada waktu hari yang salah di mana pun di luar UTC — dan tak berubah dengan musim, yang entah bug atau kelegaan bergantung pada pekerjaan.
Jenkins dan H
Jenkins menambah token yang tak dimiliki dialek lain: H, yang tampak seperti keacakan dan bukan. Jenkins meng-hash nama pekerjaan menjadi 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 mulai tepat 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 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 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 pekerjaan memakan waktu lebih lama daripada intervalnya, yang berikutnya mulai tetap saja, dan setelah beberapa saat ada beberapa. Berkas kunci adalah jawaban yang biasa.
- Ia tak punya gagasan tentang detik dalam bentuk klasik. Resolusi terhalus adalah satu menit; apa pun yang lebih cepat butuh Quartz, systemd, atau gelung di dalam pekerjaan.
- @reboot bukan jadwal. Ia berjalan sekali ketika daemon dimulai, jadi ia tak punya jalan berikutnya, dan pada mesin yang tak pernah reboot ia tak pernah berjalan sama sekali.
- Ekspresi rate dalam EventBridge menghitung dari saat 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 pekerjaan pada Senin pertama bulan?
- Tak dengan ekspresi cron polos — itu butuh "dan" antara kedua bidang hari, dan cron memberi Anda "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 bintang, cron menjalankan pekerjaan ketika salah satu cocok. Satu-satunya "dan" yang ditawarkan dialek klasik adalah aturan bintang di awal: bidang yang diawali bintang, termasuk langkah seperti */14, membalik pasangan itu kembali ke "dan", jadi sepasang hari yang dibatasi sesuka hati sama sekali tak bisa ditulis.
- 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 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 bintang dalam jam atau menit, ya: ia mengikuti jam, dan jam itu terjadi dua kali. Jika ia punya 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 ekspresi cron?
- Milik mesin, kecuali CRON_TZ atau TZ diatur dalam crontab. CronJob Kubernetes memakai UTC kecuali manifes mengatur timeZone. Karena zona bukan bagian dari ekspresi, alat ini memintanya ketimbang mengasumsikan milik peramban 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 jam. Ejaan yang biasa 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 jalan setiap 90 menit.
- Apakah ada yang saya tempel dikirim ke server?
- Tidak. Penguraian, penjelasan, dan seluruh perhitungan jadwal berjalan di peramban Anda; tak ada yang diunggah atau dicatat, dan ia bekerja tanpa koneksi jaringan.
Alat terkait
- Apa alamat IP saya
Alamat IPv4 dan IPv6 publik Anda, dan mana yang dipilih peramban.
- Konverter stempel waktu Unix
Ubah waktu epoch menjadi tanggal, dan sebaliknya.
- Kalkulator chmod
Ubah izin berkas antara oktal, simbolik, dan kotak centang.
- Kalkulator CIDR / subnet
Uraikan jaringan, cek keanggotaan, dan pecah menjadi bagian.