วิธีอ่านนิพจน์ Cron
นิพจน์ cron อธิบายตารางเวลาที่วนซ้ำด้วยฟิลด์ไม่กี่ฟิลด์ที่คั่นด้วยช่องว่าง แนวคิดนั้นเรียบง่าย แต่ลำดับฟิลด์และอักขระพิเศษแตกต่างกันในแต่ละระบบ คู่มือนี้แสดงวิธีอ่านรูปแบบที่ใช้กันทั่วไป
ห้าฟิลด์ของ Unix
cron แบบดั้งเดิมของ Unix และ Linux ใช้ห้าฟิลด์ อ่านจากซ้ายไปขวา
นาที ชั่วโมง วันที่ เดือน วันในสัปดาห์
ดังนั้น 30 9 * * 1-5 หมายถึง "เวลา 09:30 วันจันทร์ถึงวันศุกร์" นาทีมีค่าตั้งแต่ 0 ถึง 59 ชั่วโมงตั้งแต่ 0 ถึง 23 วันที่ของเดือนตั้งแต่ 1 ถึง 31 และเดือนตั้งแต่ 1 ถึง 12 วันในสัปดาห์มีค่าตั้งแต่ 0 ถึง 6 โดย 0 หมายถึงวันอาทิตย์ (หลาย implementation รับ 7 เป็นวันอาทิตย์ด้วย) เวอร์ชันส่วนใหญ่ยังรับชื่ออย่าง JAN หรือ MON และมาโครอย่าง @daily หรือ @hourly
รูปแบบ Spring, Quartz และ AWS
ตัวจัดตารางเวลาอื่นเพิ่มฟิลด์เข้ามา ซึ่งเป็นสาเหตุที่พบบ่อยที่สุดของความสับสนเมื่อคัดลอกนิพจน์จากระบบหนึ่งไปอีกระบบหนึ่ง
| รูปแบบ | ฟิลด์ | วันในสัปดาห์ |
|---|---|---|
| Unix / Linux | 5: นาที ชั่วโมง วันที่ เดือน วันในสัปดาห์ | 0–6 วันอาทิตย์ = 0 |
| Spring | 6: วินาที นาที ชั่วโมง วันที่ เดือน วันในสัปดาห์ | 0–7 วันอาทิตย์ = 0 หรือ 7 |
| Quartz | 6 หรือ 7: วินาที นาที ชั่วโมง วันที่ เดือน วันในสัปดาห์ [ปี] | 1–7 วันอาทิตย์ = 1 |
| AWS EventBridge | 6: นาที ชั่วโมง วันที่ เดือน วันในสัปดาห์ ปี | 1–7 วันอาทิตย์ = 1 |
ตัวเลขชุดเดียวกันอาจมีความหมายต่างกัน 0 0 12 * * ? หมายถึง "ทุกวันเวลาเที่ยงวัน" ใน Quartz แต่ถ้าอ่านแบบ 5 ฟิลด์จะไม่ถูกต้อง หมายเลขวันในสัปดาห์ก็เลื่อนไปด้วย ใน Quartz และ AWS 2 คือวันจันทร์ แต่ใน Unix cron คือวันอังคาร ชื่อวันอย่าง MON ช่วยหลีกเลี่ยงความกำกวมนี้ในระบบที่รองรับ
อักขระพิเศษ
*ทุกค่าของฟิลด์,รายการค่า เช่น1,15-ช่วง เช่น9-17หรือMON-FRI/ช่วงห่าง:*/15ในฟิลด์นาทีหมายถึงทุก 15 นาที ส่วน5/15เริ่มที่ 5 (cron แบบดั้งเดิมของ Unix ไม่รองรับ ต้องใช้ช่วงอย่าง5-59/15แทน)?"ไม่ระบุค่า" Quartz และ AWS กำหนดให้ใช้ในฟิลด์วันที่หรือวันในสัปดาห์ฟิลด์ใดฟิลด์หนึ่งLสุดท้าย:Lในฟิลด์วันที่คือวันสุดท้ายของเดือน ใน Quartz6Lในฟิลด์วันในสัปดาห์คือวันศุกร์สุดท้ายWวันทำงานที่ใกล้ที่สุด:15Wคือวันทำงานที่ใกล้วันที่ 15 ที่สุด#วันในสัปดาห์ลำดับที่ n ของเดือน:6#3คือวันศุกร์ที่สามตามการนับเลขของ Quartz และ AWS
L, W และ # เป็นส่วนขยายที่ cron แบบดั้งเดิมของ Unix ไม่รองรับ
วันที่กับวันในสัปดาห์
เมื่อกำหนดค่าทั้งสองฟิลด์ของวัน แต่ละระบบจะรวมเงื่อนไขต่างกัน ใน cron แบบดั้งเดิมของ Unix งานจะทำงานเมื่อฟิลด์ใดฟิลด์หนึ่งตรง 0 9 13 * 5 จึงทำงานทุกวันที่ 13 ของทุกเดือนและทุกวันศุกร์ ไม่ใช่เฉพาะวันศุกร์ที่ 13 เท่านั้น Spring กำหนดให้ตรงทั้งสองฟิลด์ ส่วน Quartz และ AWS เลี่ยงปัญหานี้โดยกำหนดให้ใส่ ? ในฟิลด์ใดฟิลด์หนึ่ง
ตัวแยกวิเคราะห์ Cron ของ LeedyBox ใช้กฎของรูปแบบที่คุณเลือก และอธิบายในสรุปว่าต้องตรงวันใดวันหนึ่งหรือต้องตรงทั้งสองวัน
เขตเวลาและเวลาออมแสง
นิพจน์ cron ไม่มีเขตเวลา นิพจน์จะทำงานตามเขตเวลาของระบบหรือบริการที่รัน ซึ่งอาจเป็นเวลาท้องถิ่นของเซิร์ฟเวอร์หรือ UTC งานที่เขียนไว้สำหรับเวลา 09:00 ตามเวลาท้องถิ่นอาจทำงานในชั่วโมงอื่นหากเซิร์ฟเวอร์ใช้ UTC
เวลาออมแสงเพิ่มกรณีขอบเพิ่มเติม เมื่อปรับนาฬิกาเดินหน้า เวลาอย่าง 02:30 อาจไม่มีอยู่ในวันนั้น เมื่อปรับนาฬิกาถอยหลัง เวลานั้นอาจเกิดขึ้นสองครั้ง งานในช่วงเวลานั้นอาจถูกข้าม ทำงานช้า หรือทำงานสองครั้ง ขึ้นอยู่กับ implementation การตั้งเวลางานสำคัญไว้นอกช่วงที่มีการเปลี่ยนเวลา หรือใช้ UTC จะช่วยลดเหตุการณ์ที่ไม่คาดคิด ตัวแยกวิเคราะห์ Cron ให้คุณเลือกเขตเวลาและแสดงเวลาทำงานครั้งถัดไป เพื่อให้คุณตรวจสอบวันที่ในช่วงที่มีการเปลี่ยนเวลาได้
คำถามที่พบบ่อย
จะตั้งให้งานทำงานทุก 5 นาทีได้อย่างไร
ใน Unix cron ให้ใช้ */5 * * * * ใน Spring ให้เพิ่มฟิลด์วินาทีไว้ด้านหน้า: 0 */5 * * * *
ทำไมนิพจน์ Quartz ของฉันจึงใช้ไม่ได้ใน crontab ของ Linux
นิพจน์ Quartz เริ่มด้วยฟิลด์วินาที และอาจใช้ ? หรือ L ซึ่ง crontab ไม่รับ ให้เขียนนิพจน์ใหม่ในรูปแบบ 5 ฟิลด์
เวลาทำงานครั้งถัดไปที่ตัวแยกวิเคราะห์แสดงนั้นแม่นยำหรือไม่
เวลาเหล่านี้คำนวณในเบราว์เซอร์ของคุณตามรูปแบบและเขตเวลาที่เลือก โปรดยืนยันตารางเวลาบนระบบที่จะรันงานจริง เพราะ implementation แต่ละตัวอาจแตกต่างกัน