ไทย

เครื่องมือสำหรับนักพัฒนา · ตัวสร้าง Crontab

ไวยากรณ์ขั้นตอนและช่วงของ Cron: */15, 1-5 รายการและวิธีการรวมเข้าด้วยกัน

· มันทำงานอย่างไร

cron การกำหนดเวลา นักพัฒนาเวิร์กโฟลว์

เครื่องหมายนาทีที่จัดกลุ่มเป็นช่วง รายการ และลำดับขั้น
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

ขั้นตอน ช่วง และรายการเป็นส่วนหนึ่งของไวยากรณ์ cron ที่ผู้คนคัดลอกโดยไม่เข้าใจ โพสต์นี้จะอธิบายแต่ละเรื่อง วิธีการจัดเรียง และความประหลาดใจอย่าง */7 ซึ่งไม่ได้หมายถึง 'ทุก ๆ เจ็ดวัน'

ทุกๆ 15 นาที แต่เพียง 9 ถึง 5 — สีหน้าไร้เดียงสาก็แสดงออกมาในตอนกลางคืนเช่นกัน

“ทุก ๆ สิบห้านาทีในช่วงเวลาทำการ” มีข้อจำกัดอิสระสองประการ ฟิลด์นาทีต้องมีเครื่องหมายควอเตอร์ชั่วโมง ในขณะที่ฟิลด์ชั่วโมงต้องมีช่วงที่มีขอบเขต การเขียนเพียง `*/15 * * * *` จะแก้ปัญหาครึ่งแรกและยังคงทำผลงานได้ตลอดทั้งคืน นิพจน์ต้องเข้ารหัสข้อจำกัดทั้งสองก่อนที่จะระบุอะไรเกี่ยวกับวันธรรมดา

ToolAcre แยกวิเคราะห์ฟิลด์กำหนดการห้าฟิลด์ ไม่ใช่คำสั่ง เริ่มต้นด้วย `*/15 9-17 * * 1-5` จากนั้นตรวจสอบประโยคและดูตัวอย่างการทำงานครั้งต่อไป การตรวจสอบดังกล่าวจับข้อผิดพลาดทั่วไปในการวาง `9-17` ในตำแหน่งนาทีหรือปล่อยให้ฟิลด์วันทำงานไม่ถูกจำกัด ตัวสร้างจะสร้างและอธิบายนิพจน์ มันไม่ได้ติดตั้งหรือดำเนินงาน

ช่วง — 1-5 และ 9-17 เป็นช่วงรวมภายในฟิลด์เดียว

ยัติภังค์จะสร้างช่วงรวมภายในหนึ่งฟิลด์ `9-17` ในตำแหน่งชั่วโมงจะขยายเป็นเก้าค่า: 9 ถึง 17 ในทำนองเดียวกัน `1-5` ในตำแหน่งวันทำงานจะขยายเป็นวันจันทร์ถึงวันศุกร์ เนื่องจากตัวแยกวิเคราะห์นี้แมปวันอาทิตย์ถึง 0 วันจันทร์ถึง 1 และอื่นๆ ปลายทางทั้งสองมีส่วนร่วม ดังนั้น 17:00 จึงอยู่ในช่วงชั่วโมงที่เลือก

ช่วงไม่สามารถพันข้ามขอบเขตฟิลด์ได้ โปรแกรมแยกวิเคราะห์ปฏิเสธรูปแบบย้อนกลับ เช่น `17-9` และแนะนำให้แยกค่าที่ต้องการออกเป็นสองรายการ การปฏิเสธนั้นมีประโยชน์ เนื่องจากกฎการตัดสินค้าแตกต่างกันระหว่างผลิตภัณฑ์ในการจัดกำหนดการ ช่วงนี้จะเลื่อนขึ้นระหว่างค่าที่ตรงตามขีดจำกัดตัวเลขหรือชื่อที่ยอมรับของฟิลด์เสมอ

ขั้นตอน — */15 และ 9-17/2, และเหตุใดขั้นตอนจึงรีสตาร์ทที่ขอบเขตล่างของฟิลด์แทนที่จะนับอย่างต่อเนื่อง

เครื่องหมายทับจะเลือกค่าทุกๆ n จากจุดเริ่มต้น `*/15` ในฟิลด์นาทีเริ่มต้นที่ค่าต่ำสุด ศูนย์ และขยายเป็น 0, 15, 30 และ 45 `9-17/2` เริ่มต้นที่ 9 และให้ผลตอบแทน 9, 11, 13, 15 และ 17 ขั้นตอนเป็นของฟิลด์เดียว ไม่นับนาทีที่ผ่านไปตามขอบเขตชั่วโมง

parser ยังยอมรับการเริ่มต้นด้วยขั้นตอนเปล่าอีกด้วย `5/15` ในฟิลด์นาทีหมายถึง 5, 20, 35 และ 50 เนื่องจากจุดสิ้นสุดบนโดยนัยคือ 59 ขั้นตอนต้องเป็นจำนวนเต็มบวกและต้องไม่เกินขนาดเต็มช่วงของช่อง ขั้นตอนที่เป็นศูนย์ ไม่ใช่ตัวเลข หรือมีขนาดใหญ่เกินไปได้รับข้อผิดพลาดในการตรวจสอบความถูกต้องเฉพาะฟิลด์ แทนที่จะตีความแบบเดา

รายการสามารถรวมค่า ช่วง และช่วงขั้นเป็นขั้นไว้ในฟิลด์เดียวได้

เครื่องหมายจุลภาคจะรวมหลายส่วนไว้ในช่องเดียวกัน `1,15,30` แบบธรรมดาตั้งชื่อค่าสามนาที ข้อมูลที่ซับซ้อนมากขึ้นสามารถรวมค่าเดียว ช่วงรวม และช่วงขั้นบันไดได้: `0,10-20/5,59` ที่ทดสอบจะขยายเป็น 0, 10, 15, 20 และ 59 ผลลัพธ์ที่ซ้ำกันจะถูกลบออก และค่าที่ขยายจะถูกจัดเรียงก่อนที่จะใช้การคำนวณในภายหลัง

ไวยากรณ์นี้มีองค์ประกอบแต่ยังคงแคบ แต่ละรายการด้วยเครื่องหมายจุลภาคอาจมีเครื่องหมายทับได้ 1 อัน และช่วงต้องมีจุดสิ้นสุดที่ไม่ว่างเปล่า 2 จุด เครื่องหมายจุลภาคที่หลงทาง เครื่องหมายทับหลายตัว หรือช่วงที่ยังเขียนไม่เสร็จจะถูกปฏิเสธด้วยเหตุผลในการตั้งชื่อฟิลด์ ซึ่งทำให้สำนวนผสมสามารถตรวจสอบได้โดยไม่ต้องแกล้งทำเป็นเครื่องหมายวรรคตอนที่มีรูปแบบไม่ถูกต้องมีความหมายทั่วไป

ตัวอย่างการทำงาน: */15 9-17 * * 1-5 — แจงนับนาทีที่สร้างขึ้นและ 17:45 edge case

สำหรับ `*/15 9-17 * * 1-5` ค่านาทีคือ 00, 15, 30 และ 45; ชั่วโมงคือ 09 ถึง 17; และค่าวันในสัปดาห์คือวันจันทร์ถึงวันศุกร์ ในแต่ละวันทำงานที่รวมไว้ ผู้สมัครคนแรกคือ 09:00 และผู้สมัครคนสุดท้ายคือ 17:45 ไม่มี 18:00 เนื่องจาก 18 อยู่นอกช่วงชั่วโมง

Last-run Edge แสดงให้เห็นว่าเหตุใดการขยายฟิลด์จึงเต้นการจดชวเลขในการสนทนา “เก้าถึงห้าโมง” อาจหมายถึงหยุดที่ 17:00 สำหรับผู้อ่านคนหนึ่ง และรวมเวลาห้าโมงเต็มให้กับอีกคนหนึ่งด้วย ช่องชั่วโมงของ Cron เลือกที่เก็บข้อมูลชั่วโมง จากนั้นช่องนาทีจะเลือกตำแหน่งภายในนั้น หาก 17:45 ไม่ต้องการ ขอบเขตที่ต้องการจำเป็นต้องมีนิพจน์หรือตรรกะฝั่งคำสั่งที่แตกต่างกัน

ขั้นตอนวันของเดือนจะขยายจากวันที่ 1 ในแต่ละเดือน ไม่ใช่ช่วงสัปดาห์ที่ผ่านไป

`*/7` ในวันของเดือนจะขยายจากค่าต่ำสุดของฟิลด์นั้นที่ 1 ทำให้ 1, 8, 15, 22 และ 29 โดยมีวันที่เหล่านั้นอยู่ เมื่อเดือนถัดไปเริ่มต้น ฟิลด์จะเริ่มต้นอีกครั้งที่ 1 ดังนั้นจึงอธิบายวันที่ในปฏิทินที่เลือก ไม่ใช่ช่วงเจ็ดวันล่วงหน้าอย่างต่อเนื่อง เดือนกุมภาพันธ์และเดือนที่สั้นกว่านั้นขาดวันที่สูงเกินไป

ไวยากรณ์เดียวกันมีค่าเริ่มต้นที่แตกต่างกันในอีกฟิลด์หนึ่ง `*/7` นาทีเริ่มต้นที่ 0 ในขณะที่ `*/7` วันของเดือนเริ่มต้นที่ 1 parser ของ ToolAcre ได้มาจากลำดับจากข้อกำหนดเฉพาะของฟิลด์แต่ละฟิลด์ และดูตัวอย่างการค้นหาวันที่ในปฏิทิน สำหรับจังหวะรายสัปดาห์ตามจริง ให้จำกัดวันในสัปดาห์แทนที่จะถือว่าการก้าวแบบวันของเดือนเป็นระยะเวลาที่ผ่านไป

ตัวดำเนินการที่ไม่ได้รับการสนับสนุนจะถูกปฏิเสธแทนที่จะตีความเป็นภาษา cron อื่น

ตัวแยกวิเคราะห์ห้าฟิลด์นี้ไม่ได้ใช้ `L`, `W`, `#` หรือ `?` อักขระเหล่านั้นจะไม่ถูกละทิ้งอย่างเงียบๆ และไม่แสดงเป็นไวยากรณ์ crontab แบบพกพา นอกจากนี้ หกฟิลด์ยังถูกปฏิเสธ โดยมีคำอธิบายว่าตำแหน่งนำพิเศษนั้นเป็นของสไตล์ตัวกำหนดเวลาที่มุ่งเน้นวินาที แทนที่จะเป็นรูปแบบที่เส้นทางนี้อ่าน

ขอบเขตเป็นแบบจงใจ: นาที ชั่วโมง วันของเดือน เดือน และวันในสัปดาห์เป็นไวยากรณ์ตำแหน่งที่สมบูรณ์ ก่อนที่จะย้ายนิพจน์จากตัวกำหนดเวลาอื่น ให้นับฟิลด์และระบุตัวดำเนินการ เครื่องกำเนิดสามารถตรวจสอบภาษาถิ่นของตัวเองได้ ไม่สามารถรับรอง Quartz, ไวยากรณ์ปฏิทิน systemd หรือการเปลี่ยนแปลงของบริการคลาวด์ได้

ประเด็นสำคัญ: ขั้นตอนหมายถึง 'เริ่มจากด้านล่างสุดของช่วง' - และเครื่องกำเนิดไฟฟ้าจะอธิบายนิพจน์ขั้นตอนเป็นคำที่คุณสามารถตรวจสอบได้

ช่วงกำหนดช่วงรวม เครื่องหมายจุลภาคผสานส่วน และเครื่องหมายทับค่าตัวอย่างจากจุดเริ่มต้นเฉพาะฟิลด์ การอ่านการดำเนินการเหล่านั้นตามลำดับจะเปลี่ยนโทเค็นหนาแน่นให้เป็นชุดจำกัดที่สามารถตรวจสอบได้ นอกจากนี้ยังอธิบายส่วนต่างๆ เช่น 17:45 โดยไม่ต้องอาศัยวลีที่คัดลอกมาซึ่งผู้เขียนอาจหมายถึงอย่างอื่น

ใช้เครื่องกำเนิดไฟฟ้าเป็นพื้นที่ตรวจสอบ: ป้อนนิพจน์ อ่านคำอธิบาย ตรวจสอบคำเตือน และเปรียบเทียบการวิ่งนาฬิกาแขวนห้าครั้งถัดไปในโซนที่ต้องการ จากนั้นวางห้าฟิลด์ที่ตรวจสอบแล้วข้างคำสั่งจริงในสภาพแวดล้อมของคุณเอง การก่อสร้างกำหนดการและการปฏิบัติงานยังคงเป็นความรับผิดชอบที่แยกจากกัน