ไทย

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

วันของเดือนเทียบกับวันในสัปดาห์ใน cron: กฎ OR ที่ทำให้ทุกคนประหลาดใจ

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

cron ปฏิทิน การกำหนดเวลา

ตัวกรองปฏิทินสองตัวที่รวมผ่านประตู OR ไว้ในกำหนดการเดียว
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

เมื่อฟิลด์ทั้งสองวันถูกจำกัด cron จะทำงานหากตรงกัน โพสต์นี้จะอธิบายกฎจาก crontab(5) เหตุใดจึงมีอยู่ และวิธีรับตารางเวลาที่ป้องกัน

รายงานดำเนินการในวันที่ 1 และทุกวันจันทร์ — นิพจน์ 0 9 1 * 1 ไม่ได้หมายความว่ามีลักษณะอย่างไร

นิพจน์ เช่น `0 9 1 * 1` จะดูเหมือน “09:00 ในวันจันทร์แรก” หากคอลัมน์สองวันถูกอ่านเป็นตัวกรองแบบสะสม ToolAcre ไม่ได้อ่านในลักษณะนั้น เมื่อตั้งค่าวันของเดือนเป็น 1 และวันในสัปดาห์ตั้งค่าเป็นวันจันทร์ โปรแกรมแยกวิเคราะห์จะเตือนว่าเงื่อนไขใดเงื่อนไขหนึ่งสามารถตรงกันได้ ดังนั้นกำหนดการจะรวมทุกวันจันทร์แรกและทุกวันจันทร์

นี่ไม่ใช่การตั้งค่าถ้อยคำเล็กน้อย รายงานรายเดือนสามารถเรียกใช้เพิ่มได้สี่หรือห้าครั้ง และการดำเนินการที่คาดหวังเฉพาะวันจันทร์ก็สามารถเรียกใช้ในวันแรกของเดือนได้เช่นกัน ตัวสร้างจะวางคำเตือน "การตรวจสอบที่คุ้มค่า" ไว้ข้างคำอธิบาย เพื่อให้มองเห็นลักษณะการทำงานแบบขยายได้ก่อนที่จะคัดลอกนิพจน์ไปยัง crontab ภายนอก

กฎตามที่เขียนไว้ — หากทั้งวันของเดือนและวันในสัปดาห์ถูกจำกัด คำสั่งจะทำงานเมื่อฟิลด์ใดฟิลด์หนึ่งตรงกัน

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

คำอธิบายยังคงใช้กฎเดียวกัน `0 0 13 * 5` แสดงผลด้วย “ในวันที่ 13 ของเดือนหรือวันศุกร์” ไม่ใช่คำร่วมที่คลุมเครือ การแยกวิเคราะห์ การเลือกเรียกใช้ครั้งต่อไป และเอาต์พุตภาษาอังกฤษล้วนใช้การตีความแบบเดียวกัน พฤติกรรมที่ใช้ร่วมกันนั้นเป็นหลักฐานที่ชัดเจนกว่าป้ายความช่วยเหลือแบบแยก เนื่องจากความขัดแย้งระหว่างเส้นทางเหล่านั้นจะสร้างการแสดงตัวอย่างที่ทำให้เข้าใจผิดทันที

parser ใช้ OR และเปิดเผยผลที่ตามมา มันไม่ได้สร้างประวัติศาสตร์ของกฎ

โครงร่างสมุดงานเสนอเหตุผลทางประวัติศาสตร์สำหรับการออกแบบ OR แต่พื้นที่เก็บข้อมูลนี้พิสูจน์พฤติกรรมมากกว่าแหล่งที่มา ความคิดเห็นของโค้ดระบุกฎสไตล์ Vixie และการทดสอบจะสร้างผลลัพธ์ที่สร้างแบบจำลองโดย ToolAcre พวกเขาไม่ได้บันทึกว่าใครเป็นผู้เลือกกฎ เมื่อกฎถูกนำมาใช้ หรือเหตุใดจึงเลือกใช้การตีความที่อนุญาต

การรักษาขอบเขตนั้นมีความสำคัญในการเขียนเชิงเทคนิค ผู้อ่านจำเป็นต้องทราบอย่างชัดเจนว่าเครื่องมือนี้ขยายนิพจน์ได้อย่างไร พวกเขาไม่จำเป็นต้องมีการเล่าเรื่องมาตรฐานที่ประดิษฐ์ขึ้นเพื่อใช้อย่างปลอดภัย หากเป้าหมายการปรับใช้บันทึกซีแมนทิกส์ของวันที่แตกต่างกัน คู่มือของเป้าหมายจะเหนือกว่าการแสดงตัวอย่างเบราว์เซอร์นี้ ToolAcre ระบุภาษาถิ่นที่คำนวณ แทนที่จะอ้างว่าผู้จัดกำหนดการทุกคนเห็นด้วย

ตัวอย่างการทำงาน: การแจงนับ 0 9 1 * 1 เป็นเวลาหนึ่งเดือน — วันที่เริ่มทำงาน เปรียบเทียบกับกำหนดการที่ผู้เขียนต้องการ

พิจารณาเดือนที่วันแรกไม่ใช่วันจันทร์ `0 9 1 * 1` สร้างหนึ่งครั้งในการวิ่งครั้งแรกและเพิ่มเติมในทุกวันจันทร์ หากวันแรกคือวันจันทร์ วันที่นั้นจะยังคงปรากฏหนึ่งครั้ง เนื่องจากการค้นหาที่เรียกใช้ครั้งถัดไปจะพิจารณาหนึ่งนาทีตามปฏิทิน ไม่ใช่ทริกเกอร์สองตัวที่แยกจากกัน สหภาพจะเปลี่ยนขนาดตามปฏิทินแต่ไม่อยู่ในตรรกะ

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

AND-รูปแบบการแก้ปัญหาคำสั่งในวันจันทร์แรกอยู่นอกตัวสร้างกำหนดการนี้

แผนแนะนำให้ฝังการทดสอบวันที่ของเชลล์เพื่อให้ได้ลักษณะการทำงาน AND ToolAcre ไม่สามารถตรวจสอบคำสั่งดังกล่าวได้: ยอมรับเฉพาะฟิลด์กำหนดการห้าฟิลด์ และบรรทัดทั้งหมดที่คัดลอกมีตัวยึดตำแหน่งที่สามารถเรียกทำงานได้ ไวยากรณ์ของเชลล์ การ Escape เปอร์เซ็นต์ ความพร้อมใช้งานของคำสั่ง และพฤติกรรมการออก ล้วนเป็นของสภาพแวดล้อมที่จะรันงานในท้ายที่สุด

ภายในตัวสร้างนี้ การออกแบบที่ปลอดภัยคือปล่อยให้ฟิลด์หนึ่งวันเป็น `*` เว้นแต่ว่าการรวม OR จะมีจุดประสงค์อย่างแท้จริง สำหรับข้อกำหนดในวันจันทร์แรก เอกสารที่ว่า cron ห้าฟิลด์เพียงอย่างเดียวไม่ได้แสดงถึงจุดตัดในภาษาถิ่นนี้ เลือกและทดสอบโซลูชันเฉพาะสภาพแวดล้อมแยกกัน แทนที่จะนำเสนอตัวอย่างที่ยังไม่ได้ดำเนินการตามที่รับประกัน

ตัวดำเนินการกำหนดเวลาอื่น ๆ จะไม่ถูกตีความโดย parser ห้าฟิลด์นี้

ไวยากรณ์ตัวกำหนดเวลาบางตัวเปิดเผยตัวดำเนินการ เช่น `#`, `L`, `W` หรือ `?` แต่ parser นี้ไม่ยอมรับเลย นอกจากนี้ยังปฏิเสธหกฟิลด์และอธิบายว่าสัญญาของมันคือไวยากรณ์ crontab ห้าฟิลด์ ดังนั้นจึงไม่สามารถวางนิพจน์ที่ใช้งานได้ในผลิตภัณฑ์อื่นที่นี่เพื่อเป็นหลักฐานว่ามีกฎปฏิทินเดียวกันอยู่

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

การ Escape คำสั่งอยู่นอกไวยากรณ์นิพจน์เท่านั้น

เปอร์เซ็นต์เครื่องหมายและการอ้างอิงคำสั่งปรากฏขึ้นหลังกำหนดการและอยู่นอก `parseCron` โปรแกรมแยกวิเคราะห์แบ่งหนึ่งนิพจน์ออกเป็นห้าส่วนที่คั่นด้วยช่องว่าง มันไม่เคยอ่านเชลล์ไปป์ไลน์ คำสั่ง date หรือเพย์โหลดคำสั่ง Escape ดังนั้น บทความนี้ไม่ได้สอนวิธีแก้ไขปัญหาเครื่องหมายเปอร์เซ็นต์แม้ว่าสมุดงานจะเสนอก็ตาม

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

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

เมื่อฟิลด์ทั้งสองวันถูกจำกัด ให้อ่านเป็นสหภาพแล้วออกเสียง "หรือ" ยังดีกว่า ตรวจสอบคำเตือนของเครื่องกำเนิดไฟฟ้าและการวิ่งที่กำลังจะเกิดขึ้น หากวันที่เหล่านั้นเกินกำหนดไว้ ให้ส่งคืนฟิลด์หนึ่งฟิลด์เป็น `*` และแก้ไขข้อกำหนดพิเศษเพิ่มเติมใดๆ ด้วยกลไกที่จัดทำเอกสารโดยสภาพแวดล้อมเป้าหมาย

บทเรียนหลักไม่ใช่ว่าครอนนั้นลึกลับ ก็คือคอลัมน์สองคอลัมน์ที่อยู่ติดกันไม่รวมกันเหมือนกับข้อจำกัดอื่นๆ ToolAcre รวมศูนย์ข้อยกเว้นนั้นไว้ในการแยกวิเคราะห์ คำอธิบาย และตรรกะการแสดงตัวอย่าง ใช้มุมมองทั้งสามนี้เพื่อตรวจจับความไม่ตรงกันก่อนที่นิพจน์จะออกจากเบราว์เซอร์และกลายเป็นกำหนดการปฏิบัติงาน