Crontab Guru

วางนิพจน์ cron แล้วรับคำอธิบายทีละฟิลด์เป็นภาษาอังกฤษที่เข้าใจง่ายว่ามันทำงานอย่างไร ไม่ต้องจำลำดับของฟิลด์หรือเปิดดูช่วงค่าให้ยุ่งยาก เพราะ Guru จะไล่ครบทั้งห้าฟิลด์ (นาที, ชั่วโมง, วันของเดือน, เดือน และวันในสัปดาห์) แล้วอ่านนิพจน์จากซ้ายไปขวา มีประโยชน์สำหรับตรวจสอบบรรทัด crontab ก่อนนำไปใช้งาน หรืออธิบายบรรทัดที่รับช่วงต่อมา

วิธีใช้งาน Guru

  1. 1

    วางนิพจน์

    คัดลอกนิพจน์ cron มาตรฐานแบบ 5 ฟิลด์ (เช่น `0 9 * * 1-5`) ลงในช่องกรอก

  2. 2

    ขอคำอธิบาย

    กด Explain Cron แล้วเครื่องมือจะแสดงคำอธิบายทีละบรรทัดของแต่ละฟิลด์: นาที, ชั่วโมง, วันของเดือน, เดือน และวันในสัปดาห์

  3. 3

    อ่านคำอธิบาย

    คำอธิบายถูกสร้างเป็นภาษาอังกฤษ เช่น "Minute: every 5 minutes" หรือ "Hour: from 9 through 17."

  4. 4

    ตรวจสอบก่อนนำไปใช้งาน

    ใช้คำอธิบายยืนยันว่าตารางเวลาทำงานตามที่ต้องการ ก่อนนำไปใส่ใน crontab, ไฟล์กำหนดค่า CI หรือ Kubernetes manifest

ตารางสรุปฟิลด์

 ┌───────────── นาที (0-59)
 │ ┌─────────── ชั่วโมง (0-23)
 │ │ ┌───────── วันที่ของเดือน (1-31)
 │ │ │ ┌─────── เดือน (1-12 หรือ JAN-DEC)
 │ │ │ │ ┌───── วันในสัปดาห์ (0-6 หรือ SUN-SAT; อาทิตย์ = 0 หรือ 7)
 │ │ │ │ │
 * * * * *

ตัวดำเนินการในนิพจน์ cron

ตัวดำเนินการ ความหมาย ตัวอย่าง
* ทุกค่า * * * * *
, รายการค่า 0,15,30,45
- ช่วง 9-17
/ สเต็ป (ค่าเริ่มต้น/ระยะก้าว) */5, 0-30/5
L สุดท้าย (วันสุดท้ายของเดือน หรือวันสุดท้ายที่ตรงกับวันนั้น, Quartz) L, 5L
W วันธรรมดาที่ใกล้ที่สุด 15W (Quartz)
# วันที่ตรงกับวันนั้นครั้งที่ N ของเดือน 1#3 (Quartz)
? ไม่ระบุค่าเฉพาะ เฉพาะ Quartz

ลำดับการอ่านสำคัญ

0 */2 * * 1-5 อ่านจากซ้ายไปขวาว่า: นาทีที่ 0, ทุก 2 ชั่วโมง, วันใดก็ได้ของเดือน, เดือนใดก็ได้, วันจันทร์ถึงวันศุกร์ คนเรามักอ่านฟิลด์จากขวาไปซ้ายตามความเคยชินจนสับสน ให้เริ่มจาก “นาที” เสมอ

กับดัก “ทุก X นาที”

*/10 * * * * จะทำงานในนาทีที่ 0, 10, 20, 30, 40, 50 ไม่ใช่ “ทุก 10 นาทีนับจากตอนที่สร้างงาน” สเต็ปของ cron จะนับจากจุดเริ่มต้นของช่วงค่าในฟิลด์เสมอ หากคุณดีพลอยงานในเวลา 12:03 การทำงานครั้งแรกจะเกิดขึ้นที่ 12:10 ไม่ใช่ 12:13

สำหรับงานที่ต้องการ “N นาทีหลังจากการทำงานครั้งล่าสุด” จริง ๆ ให้ใช้ตัวจัดตารางที่มีตัวจับเวลาแบบถาวร (systemd timers ที่ใช้ OnUnitActiveSec หรือการจัดตารางในระดับแอปพลิเคชันที่เก็บเวลาทำงานครั้งล่าสุดไว้)

กับดักของ cron ที่น่ารู้

  • ตั้งทั้งวันที่ของเดือนและวันในสัปดาห์พร้อมกัน: การใช้งาน cron ส่วนใหญ่ถือว่าเป็นแบบ OR ซึ่งมักไม่ใช่สิ่งที่คุณต้องการ
  • สเต็ปเป็น 0: */0 ใช้ไม่ได้
  • ช่วงที่คาบเกี่ยวข้ามวัน: 22-2 สำหรับชั่วโมงใช้ไม่ได้ใน cron แบบดั้งเดิม ให้ใช้ 22-23,0-2
  • 30 กุมภาพันธ์: ตารางอย่าง 0 0 30 2 * จะไม่ทำงานเลย
  • ความกำกวมของ DST: งานที่ตั้งไว้ระหว่างตี 2 ถึงตี 3 อาจทำงานสองครั้งหรือไม่ทำงานเลยในวันที่มีการเปลี่ยนเวลาออมแสง (DST)

cron เทียบกับตัวจัดตารางสมัยใหม่

cron ของ Unix ยังถูกใช้อยู่ทั่วไป แต่สำหรับงานสำคัญ คุณน่าจะต้องการสิ่งเหล่านี้:

  • systemd timers: ตามจับการทำงานที่พลาดไป รองรับการสุ่มเลื่อนเวลา และอ่านค่าจากไฟล์ยูนิต
  • Kubernetes CronJob: เชิงประกาศ (declarative) รองรับการลองใหม่ และรับรู้เขตเวลาในเวอร์ชัน 1.25 ขึ้นไป
  • Airflow / Prefect / Dagster: สำหรับงานที่มีการพึ่งพากัน การลองใหม่ การเติมข้อมูลย้อนหลัง และการสังเกตการณ์
  • GitHub Actions schedule: cron แบบ 5 ฟิลด์ ใช้ UTC เท่านั้น ช่วงต่ำสุด 5 นาที และส่งแบบ best-effort

ตัว cron เองเป็นรูปแบบที่ยอดเยี่ยม แต่เป็นตัวจัดตารางที่ไม่เหมาะกับงานที่ห้ามพลาด

คำถามที่พบบ่อย

เพราะวันในสัปดาห์เลข 0 คือวันอาทิตย์ใน cron มาตรฐาน (และเลข 7 ก็คือวันอาทิตย์เช่นกัน จึงรองรับทั้งสองแบบ) วันจันทร์คือเลข 1 ส่วน Quartz กำหนดเลขวันในสัปดาห์เป็น 1-7 โดยให้วันอาทิตย์ = 1 ซึ่งมักทำให้คนที่สลับไปมาระหว่างระบบสับสน

cron แบบดั้งเดิมของ Unix ทำงานตามเขตเวลาท้องถิ่นของเซิร์ฟเวอร์ ตามที่ /etc/timezone ระบุไว้ ส่วน Kubernetes CronJob, GitHub Actions และตัวจัดตารางบนคลาวด์ส่วนใหญ่ทำงานด้วย UTC เป็นค่าเริ่มต้น ควรตรวจสอบเสมอ และถ้าเป็นไปได้ ให้ใช้ UTC เพื่อเลี่ยงปัญหาจากเวลาออมแสง (DST)

cron แบบดั้งเดิมไม่สามารถระบุสิ่งนี้ได้โดยตรง วิธีแก้คือให้รันทุกวันจันทร์ แล้วตรวจสอบวันที่ภายในสคริปต์: [ $(date +%d) -le 7 ] && ./job.sh ส่วน Quartz รองรับได้ในตัวด้วย 1#1

ไม่ได้ แต่ละตารางต้องมีบรรทัดของตัวเอง อย่างไรก็ตาม คุณสามารถรวมหลายตารางไว้ในบรรทัดเดียวได้โดยใช้รายการค่า: 0 9,17 * * * จะทำงานเวลา 9 โมงเช้าและ 5 โมงเย็น สำหรับตารางที่ไม่สามารถเขียนเป็นบรรทัดเดียวได้ ให้เพิ่มหลายบรรทัดที่ชี้ไปยังคำสั่งเดียวกัน

เครื่องมือที่เกี่ยวข้อง

ตารางอ้างอิง ASCII

ตาราง ASCII ครบตั้งแต่ 0 ถึง 127 พร้อมค่าเลขฐานสิบ ฐานสิบหก ฐานแปด ฐานสอง และรูปแบบการอ้างอิงอักขระแบบตัวเลขของ HTML รวม NUL, LF และ DEL

อ้างอิงตัวอักษร HTML

รายการที่สามารถค้นหาได้ขององค์ประกอบ HTML พร้อมรหัสชื่อและรหัสตัวเลข รวมถึงฟังก์ชันสำเนาด้วยคลิกเดียวสำหรับตัวอักษรพิเศษและสัญลักษณ์ต่างๆ

ตารางอ้างอิงแป้นพิมพ์ลัด

ค้นหาแป้นพิมพ์ลัดเริ่มต้นตามเอกสารของ VS Code, Chrome และ Bash ที่ใช้ GNU Readline บน macOS, Windows และ Linux

ตัวลดรูปพีชคณิตบูลีน

ประเมินนิพจน์บูลีนสำหรับทุกชุดอินพุตและดูตารางค่าความจริงที่สมบูรณ์ รองรับตัวแปรสูงสุดห้าตัวและตัวดำเนินการ &, |, !, ^

เครื่องสร้างตัวอักษรสุ่ม

สร้างตัวอักษร A-Z แบบสุ่ม เลือกจำนวน ตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก หรือแบบผสม แล้วใช้กับเกม โจทย์ หรือกิจกรรมในห้องเรียน

เครื่องมือตรวจสอบหมายเลขโทรศัพท์

ตรวจสอบโครงสร้างหมายเลขตามประเทศ พร้อมดูภูมิภาค ประเภท และรูปแบบ E.164 ระหว่างประเทศ ในประเทศ และ RFC 3966