ข้ามไปยังเนื้อหา
LeedyBox
สนับสนุน

วิธีอ่านนิพจน์ 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 / Linux5: นาที ชั่วโมง วันที่ เดือน วันในสัปดาห์0–6 วันอาทิตย์ = 0
Spring6: วินาที นาที ชั่วโมง วันที่ เดือน วันในสัปดาห์0–7 วันอาทิตย์ = 0 หรือ 7
Quartz6 หรือ 7: วินาที นาที ชั่วโมง วันที่ เดือน วันในสัปดาห์ [ปี]1–7 วันอาทิตย์ = 1
AWS EventBridge6: นาที ชั่วโมง วันที่ เดือน วันในสัปดาห์ ปี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 ในฟิลด์วันที่คือวันสุดท้ายของเดือน ใน Quartz 6L ในฟิลด์วันในสัปดาห์คือวันศุกร์สุดท้าย
  • 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 แต่ละตัวอาจแตกต่างกัน