Crontab Guru
วางนิพจน์ cron แล้วรับคำอธิบายทีละฟิลด์เป็นภาษาอังกฤษที่เข้าใจง่ายว่ามันทำงานอย่างไร ไม่ต้องจำลำดับของฟิลด์หรือเปิดดูช่วงค่าให้ยุ่งยาก เพราะ Guru จะไล่ครบทั้งห้าฟิลด์ (นาที, ชั่วโมง, วันของเดือน, เดือน และวันในสัปดาห์) แล้วอ่านนิพจน์จากซ้ายไปขวา มีประโยชน์สำหรับตรวจสอบบรรทัด crontab ก่อนนำไปใช้งาน หรืออธิบายบรรทัดที่รับช่วงต่อมา
วิธีใช้งาน Guru
-
1
วางนิพจน์
คัดลอกนิพจน์ cron มาตรฐานแบบ 5 ฟิลด์ (เช่น `0 9 * * 1-5`) ลงในช่องกรอก
-
2
ขอคำอธิบาย
กด Explain Cron แล้วเครื่องมือจะแสดงคำอธิบายทีละบรรทัดของแต่ละฟิลด์: นาที, ชั่วโมง, วันของเดือน, เดือน และวันในสัปดาห์
-
3
อ่านคำอธิบาย
คำอธิบายถูกสร้างเป็นภาษาอังกฤษ เช่น "Minute: every 5 minutes" หรือ "Hour: from 9 through 17."
-
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