Ekspresi Cron Dijelaskan: Jadualkan Apa Sahaja
Anda perlu menjalankan sandaran pangkalan data setiap malam pada pukul 3 pagi. Atau menghantar laporan setiap Isnin pagi. Atau membersihkan cache setiap 15 minit. Pada pelayan Linux dan Unix, alat untuk ini adalah cron, dan cara anda memberitahu cron bila untuk menjalankan sesuatu adalah dengan ekspresi cron.
Ekspresi cron kelihatan menakutkan pada pandangan pertama. 0 3 * * * atau */15 9-17 * * 1-5 boleh kelihatan seperti omong kosong jika anda tidak mengetahui coraknya. Tetapi sintaksnya sangat mudah apabila anda memahami lima medan.
Lima Medan
Setiap ekspresi cron standard mempunyai tepat lima medan, dipisahkan oleh ruang. Setiap medan mewakili unit masa:
┌───────────── minit (0-59)
│ ┌───────────── jam (0-23)
│ │ ┌───────────── hari dalam bulan (1-31)
│ │ │ ┌───────────── bulan (1-12)
│ │ │ │ ┌───────────── hari dalam minggu (0-7, di mana 0 dan 7 adalah Ahad)
│ │ │ │ │
* * * * *
Itulah sahaja. Lima medan, dari kiri ke kanan: minit, jam, hari dalam bulan, bulan, hari dalam minggu.
Tahukah anda? Nama "cron" berasal dari perkataan Yunani "chronos," bermakna masa. Daemon cron (proses latar belakang) telah menjadi bahagian teras sistem operasi seperti Unix sejak tahun 1975.
Aksara Khas
Asterisk (*) — Setiap Nilai
Asterisk bermakna "setiap nilai yang mungkin" untuk medan itu.
* * * * * = setiap minit setiap jam setiap hari.
Koma (,) — Pelbagai Nilai
Koma memisahkan nilai individu.
0 9,12,18 * * * = pada minit 0 jam 9, 12, dan 18 (9:00 pagi, 12:00 tengah hari, 6:00 petang).
Sengkang (-) — Julat Nilai
Sengkang mentakrifkan julat.
0 9-17 * * * = pada minit 0 setiap jam dari 9 hingga 17 (9:00 pagi hingga 5:00 petang, setiap jam).
Garis Miring (/) — Nilai Langkah
Garis miring mentakrifkan selang.
*/15 * * * * = setiap 15 minit (minit 0, 15, 30, 45 setiap jam).
0 */2 * * * = setiap 2 jam pada minit 0 (tengah malam, 2 pagi, 4 pagi, ...).
Membaca Ekspresi Cron: Latihan
Mari kita lalui contoh-contoh biasa. Untuk setiap satu, baca lima medan dari kiri ke kanan.
0 3 * * * — Setiap Hari pada Pukul 3:00 Pagi
| Medan | Nilai | Makna |
|---|---|---|
| Minit | 0 | Pada minit 0 |
| Jam | 3 | Jam 3 (3 pagi) |
| Hari dalam bulan | * | Setiap hari |
| Bulan | * | Setiap bulan |
| Hari dalam minggu | * | Setiap hari dalam minggu |
Terjemahan: "Pada pukul 3:00 pagi setiap hari." Pilihan klasik untuk sandaran malam.
*/15 * * * * — Setiap 15 Minit
| Medan | Nilai | Makna |
|---|---|---|
| Minit | */15 | Setiap 15 minit |
| Jam | * | Setiap jam |
| Hari dalam bulan | * | Setiap hari |
| Bulan | * | Setiap bulan |
| Hari dalam minggu | * | Setiap hari |
Terjemahan: "Setiap 15 minit, sepanjang masa." Biasa untuk semakan kesihatan dan penyegaran cache.
0 9 * * 1-5 — Hari Bekerja pada Pukul 9:00 Pagi
| Medan | Nilai | Makna |
|---|---|---|
| Minit | 0 | Pada minit 0 |
| Jam | 9 | Jam 9 |
| Hari dalam bulan | * | Setiap hari |
| Bulan | * | Setiap bulan |
| Hari dalam minggu | 1-5 | Isnin hingga Jumaat |
Terjemahan: "Pada pukul 9:00 pagi, Isnin hingga Jumaat." Sempurna untuk laporan kerja harian.
0 0 1 * * — Hari Pertama Setiap Bulan
| Medan | Nilai | Makna |
|---|---|---|
| Minit | 0 | Pada minit 0 |
| Jam | 0 | Jam 0 (tengah malam) |
| Hari dalam bulan | 1 | Pada hari ke-1 |
| Bulan | * | Setiap bulan |
| Hari dalam minggu | * | Mana-mana hari dalam minggu |
Terjemahan: "Pada tengah malam pada hari pertama setiap bulan." Digunakan untuk laporan bulanan, pengebilan, atau pembersihan.
30 8 * * 1 — Isnin pada Pukul 8:30 Pagi
| Medan | Nilai | Makna |
|---|---|---|
| Minit | 30 | Pada minit 30 |
| Jam | 8 | Jam 8 |
| Hari dalam bulan | * | Setiap hari |
| Bulan | * | Setiap bulan |
| Hari dalam minggu | 1 | Isnin |
Terjemahan: "Pada pukul 8:30 pagi setiap Isnin." Bagus untuk pemberitahuan pasukan mingguan.
Menulis Ekspresi Cron Anda Sendiri
Berikut adalah pendekatan yang sistematik:
- Mulakan dengan bila. "Setiap hari pada pukul 3 pagi" atau "setiap 5 minit semasa waktu perniagaan."
- Isi medan dari kiri ke kanan. Mulakan dengan minit, kemudian jam, kemudian hari dalam bulan, kemudian bulan, kemudian hari dalam minggu.
- Gunakan
*untuk "setiap." Jika anda tidak mengambil berat tentang medan, gunakan*. - Uji sebelum deploy. Sentiasa sahkan ekspresi anda menghasilkan jadual yang anda jangkakan.
Rujukan Cepat Corak Biasa
| Jadual | Ekspresi |
|---|---|
| Setiap minit | * * * * * |
| Setiap 5 minit | */5 * * * * |
| Setiap jam | 0 * * * * |
| Setiap hari pada tengah malam | 0 0 * * * |
| Setiap hari pada pukul 3:00 pagi | 0 3 * * * |
| Setiap Isnin pada pukul 9:00 pagi | 0 9 * * 1 |
| Hari bekerja pada pukul 8:30 pagi | 30 8 * * 1-5 |
| Pertama setiap bulan | 0 0 1 * * |
| Setiap 15 min, waktu perniagaan | */15 9-17 * * 1-5 |
| Dua kali sehari (9 pagi dan 6 petang) | 0 9,18 * * * |
| Setiap Ahad pada pukul 2:00 pagi | 0 2 * * 0 |
Kesilapan Biasa
Lupa Bahawa Jam Adalah 0-23
Jam 13 adalah 1:00 petang, bukan jam 1. Kesilapan biasa adalah menulis 0 1 * * * dengan fikiran ia berjalan pada pukul 1:00 petang apabila ia sebenarnya berjalan pada pukul 1:00 pagi.
Kekeliruan Hari Dalam Minggu
Ahad boleh menjadi 0 atau 7 (kedua-duanya sah). Isnin adalah 1, Sabtu adalah 6. Sesetengah orang menjangkakan Isnin menjadi 0.
Interaksi Hari Dalam Bulan vs. Hari Dalam Minggu
Jika anda menentukan kedua-dua hari dalam bulan dan hari dalam minggu (tiada yang *), kebanyakan pelaksanaan cron menjalankan kerja apabila sama ada syarat dipenuhi, bukan apabila kedua-duanya dipenuhi. Ini mengejutkan ramai orang.
Amaran Ekspresi 0 9 15 * 1 TIDAK bermakna "pada pukul 9 pagi pada hari ke-15, tetapi hanya jika itu hari Isnin." Ia bermakna "pada pukul 9 pagi pada hari ke-15 setiap bulan DAN pada pukul 9 pagi setiap Isnin." Ini adalah sumber tingkah laku tidak dijangka yang biasa.
Kesedaran Zon Masa
Cron berjalan dalam zon masa tempatan pelayan. Jika pelayan anda berada dalam UTC dan anda berada di Kuala Lumpur (UTC+8), kerja cron 0 9 * * * berjalan pada pukul 5:00 petang waktu anda. Sentiasa semak zon masa pelayan anda.
Petua Uji dan visualisasikan ekspresi cron anda sebelum mendeploy: Cara Membaca dan Menguji Ekspresi Cron. Lihat masa jalankan berikutnya dan sahkan jadual sepadan dengan apa yang anda maksudkan.
Bina dan uji ekspresi cron anda:
Percuma, serta-merta, dan tiada pendaftaran diperlukan.