Apakah ungkapan cron?
Ungkapan cron ialah rentetan penjadualan ringkas yang memberitahu penjadual tugas dengan tepat bila untuk mencetuskan tugas. Format ini lahir pada tahun 1975 di dalam daemon Unix V7 cron dan hampir tidak berubah sejak itu — tatabahasa lima medan yang sama muncul hari ini dalam Kubernetes CronJobs, AWS EventBridge, aliran kerja GitHub Actions, Google Cloud Scheduler, GitLab CI, saluran paip Jenkins, dan binari crontab yang masih dihantar bersama setiap pengedaran Linux. Tatabahasa itu memuatkan banyak makna dalam kira-kira tiga belas aksara, itulah sebabnya penghurai yang menukarnya kepada bahasa biasa adalah perbezaan antara penggunaan yang yakin dan rollback pukul 3 pagi.
Bagaimana ungkapan cron berfungsi?
Ungkapan cron piawai mempunyai lima medan berpisah ruang yang bersama-sama menentukan jadual berulang. Enjin menyemak jam dinding semasa terhadap ungkapan setiap minit dan mencetuskan tugas apabila kelima-lima medan sepadan. Medan dari kiri ke kanan:
- Minit (0–59). Minit mana dalam jam tugas berjalan.
0bermakna tepat jam,30bermakna setengah jam,*/5bermakna setiap lima minit (00, 05, 10, ...), dan15,45bermakna pada suku lewat dan suku sebelum. - Jam (0–23). Jam mana dalam hari pada jam 24 jam.
0ialah tengah malam,9ialah 9 PG,17ialah 5 PTG. Julat (9-17untuk waktu perniagaan) dan nilai langkah (*/2untuk setiap jam lain) berfungsi sama seperti untuk minit. - Hari bulan (1–31). Hari kalendar mana untuk berjalan.
1bermakna ke-1 bulan,*bermakna setiap hari,1,15bermakna ke-1 dan ke-15. Berhati-hati dengan31— ia secara senyap melangkau bulan yang tidak mempunyai hari ke-31. - Bulan (1–12 atau JAN–DEC). Bulan mana untuk berjalan.
*bermakna setiap bulan,1,7bermakna Januari dan Julai,1-3bermakna Q1 sahaja. Nama bulan tiga huruf tidak sensitif huruf besar dalam kebanyakan pelaksanaan. - Hari minggu (0–7, di mana 0 dan 7 bermakna Ahad). Menghadkan pencetus kepada hari bekerja tertentu.
1-5ialah Isnin hingga Jumaat,0,6ialah hujung minggu,MON-FRIberfungsi dalam kebanyakan penghurai. Apabila hari-bulan dan hari-minggu ditetapkan kepada nilai tertentu, cron klasik mencetuskan pada mana-mana padanan (OR logik), yang mengejutkan semua orang setiap kali.
Mengapa menggunakan penghurai ungkapan cron?
- Tangkap salah baca senyap sebelum penggunaan. Ungkapan `0 2 */3 * *` mencetuskan pukul 2 PG setiap tiga hari, bukan setiap tiga minit — tampalkannya di sini dan anda akan melihatnya dalam bahasa biasa sebelum ia dihantar ke pengeluaran.
- Kebanyakan penjadual awan berjalan dalam UTC secara lalai. Mempratonton sepuluh masa pencetus seterusnya dalam zon tempatan anda mendedahkan drift DST satu jam sebelum ia menghubungi seseorang pada pukul 3 pagi.
- Pintasan seperti `@daily`, `@weekly`, dan `@monthly` mudah tetapi tidak jelas. Penghurai menunjukkan bentuk lima medan yang mendasari supaya anda tahu dengan tepat apa yang dijadualkan.
- Pembina medan demi medan membolehkan anda membina jadual satu lajur pada satu masa dan menonton penerangan manusia dikemas kini secara langsung, yang jauh lebih pantas daripada membaca semula halaman man cron untuk kali kesepuluh.
Di mana ungkapan cron digunakan?
Sintaks cron muncul di mana sahaja tugas perlu diulang mengikut jam. Tiga permukaan yang paling biasa, dengan gotcha tepat yang terkenal setiap satunya:
- Jadual sandaran. Entri `crontab -e` klasik yang mengalirkan pangkalan data ke S3 pukul 2 PG setiap malam, atau memutar arkib `pg_dump` pada ke-1 setiap bulan. Baris seperti `0 2 * * * /usr/local/bin/backup.sh` telah dihantar pada lebih banyak pelayan Linux daripada mana-mana baris cron lain dalam sejarah. Betulkan minit dan jam, ubah hala stderr ke tempat yang tahan lama, dan anda telah menggantikan senarai semak manual dengan skrip tembak-dan-lupakan.
- Pencetus `schedule` GitHub Actions. Kunci `on.schedule.cron` dalam `.github/workflows/*.yml` menerima cron lima medan piawai, tetapi tugas sentiasa berjalan dalam UTC dan GitHub akan secara senyap melangkau masa pencetus jika baris gilir runner sibuk. Corak lazim: `cron: '0 9 * * 1-5'` untuk menghantar intisari Isnin-hingga-Jumaat pukul 9 PG UTC. Pratonton di sini dalam zon tempatan anda dahulu supaya anda tidak berjanji intisari 9 PG London yang sebenarnya tiba pukul 10 PG dalam BST.
- AWS EventBridge Scheduler. Ungkapan cron EventBridge mengambil medan keenam untuk tahun dan memerlukan `?` bukannya `*` dalam sama ada medan hari-bulan atau hari-minggu — `cron(0 9 ? * MON-FRI *)` ialah terjemahan EventBridge cron weekday 9 PG piawai klasik. Digunakan untuk invokasi Lambda berjadual, jalan tugas ECS, dan permulaan mesin keadaan Step Function; ketidakselarasan dengan sintaks cron klasik adalah punca nombor satu ralat `ValidationException` dalam penggunaan CloudFormation.
Bagaimana rupa ungkapan cron sebenar?
Ambil 0 9 * * 1-5 — mencetuskan pukul 9:00 PG, setiap hari bekerja. Membaca medan dari kiri ke kanan: 0 ialah minit sifar jam, 9 ialah 9 PG pada jam 24 jam, * pada hari-bulan bermakna setiap hari kalendar, * pada bulan bermakna setiap bulan, dan 1-5 pada hari-minggu menghadkan pencetus kepada Isnin hingga Jumaat (di mana 1 = Isnin dalam penomboran cron piawai). Tampalkan ke dalam input di atas dan penghurai mengesahkan Pada 09:00 PG, Isnin hingga Jumaat dengan sepuluh tarikh pencetus seterusnya dipaparkan dalam zon IANA yang anda pilih. Niat yang sama dalam sintaks AWS EventBridge ialah cron(0 9 ? * MON-FRI *) — perhatikan medan tahun di hujung dan ? di mana cron piawai akan menggunakan *. Niat yang sama sebagai ungkapan Quartz (enam medan dengan saat pendahuluan) ialah 0 0 9 ? * MON-FRI. Tiga platform berbeza, tiga bentuk permukaan berbeza, satu jadual mendasari.
Ungkapan cron tidak berampun dalam satu cara tepat: kesilapan taip memberikan anda jadual yang sah secara sintaks yang mencetuskan pada masa yang salah, tanpa ralat untuk ditangkap dalam semakan kod. Membaca `0 0 1 * *` dan mengetahui ia berjalan pada tengah malam pada ke-1 setiap bulan, bukan pada 1 Januari, memerlukan latihan. Penghurai di atas mengubah latihan itu menjadi semakan kesihatan sepuluh saat — tampal ungkapan, baca bahasa Inggeris, imbas sepuluh masa pencetus seterusnya dalam zon tempatan anda, dan hantar YAML mengetahui baris cron sebenarnya melakukan apa yang mesej komit mengatakannya.
Apakah perbezaan antara cron 5 medan dan 6 medan?
Cron lima medan ialah tatabahasa Unix klasik dengan resolusi satu minit. Cron enam medan menambah lajur saat pendahuluan untuk penjadualan sub-minit — digunakan oleh Quartz dan `@Scheduled` Spring. AWS EventBridge juga menggunakan enam medan, tetapi lajur tambahannya ialah tahun di belakang, bukan saat.
Apakah maksud @hourly, @daily, dan @weekly?
Nama panggilan Vixie-cron yang diperkenalkan pada tahun 1987. @hourly = 0 * * * *, @daily = 0 0 * * *, @weekly = 0 0 * * 0, @monthly = 0 0 1 * *, @yearly = 0 0 1 1 *. @reboot mencetuskan sekali semasa but. GitHub Actions dan EventBridge menolak alias ini.
Adakah Ahad hari 0 atau hari 7 dalam cron?
Kedua-duanya, dalam Vixie cron klasik — 0 dan 7 diterima supaya julat seperti 5-7 dibaca secara semula jadi sebagai Jumaat-hingga-Ahad. Isnin sentiasa 1, Sabtu sentiasa 6. Quartz dan AWS EventBridge menggunakan konvensyen berbeza: 1-7 dengan Ahad sebagai 1. Semak dokumentasi platform sebelum membuat andaian.
Bagaimana cron mengendalikan waktu penjimatan siang?
Bergantung pada zon waktu enjin. Dalam UTC (lalai pada EventBridge, Kubernetes, dan GitHub Actions) DST tidak wujud. Dalam zon DST tempatan, Vixie cron klasik melangkau tugas semasa jurang spring-forward dan menjalankannya dua kali semasa fall-back; pemasa systemd mencetuskan tepat sekali.