เลิกใช้ Cron หันมาใช้งาน systemd.timer บน Linux ดีกว่า
คู่มือการใช้งาน systemd.timer บน Linux เพื่อจัดการงานรันอัตโนมัติแทน cron แบบเดิม พร้อมตัวอย่างการตั้งค่า Calendar และ Monotonic timers

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- systemd.timer เข้ามาทดแทน cron แบบเดิมพร้อมข้อดีด้านการจัดการและ dependency
- รองรับทั้งเงื่อนไขเวลาแบบปฏิทิน (Calendar) และช่วงเวลา (Monotonic)
- มีฟังก์ชันช่วยจัดการความหน่วงและป้องกันปัญหารันงานซ้อนทับ
การตั้งเวลารันงานอัตโนมัติบนระบบปฏิบัติการ Linux แบบดั้งเดิมมักพึ่งพา crontab เสมอ แต่ในปัจจุบัน systemd มีเครื่องมือระดับเฟิร์สคลาสอย่าง .timer units เข้ามาทำหน้าที่นี้ โดยแยกส่วนการกำหนดเวลา (.timer) ออกจากงานที่ต้องการรัน (.service) ทำให้ผู้ดูแลระบบสามารถใช้งาน journal, sandbox, ข้อมูลรับรอง และการควบคุมทรัพยากรแบบเดียวกับ daemons ทั่วไปได้ทันที แถมยังมาพร้อมกับนิพจน์ปฏิทินที่ทดสอบได้ง่ายกว่าสตริง cron แบบห้าฟิลด์
คู่มือการใช้งานนี้อ้างอิงพฤติกรรมและค่าเริ่มต้นจาก systemd.timer(5), systemd.time(7), systemd.service(5), systemd.exec(5), systemctl(1) และ stock units บน systemd 257 ซึ่งผ่านการตรวจสอบบน Debian 13 หรือรุ่น 257.13 โดยสามารถทดแทนคำสั่งรันสคริปต์รายคืน ทุกๆ N นาที หรือครั้งเดียวหลังบูตเครื่องได้เป็นอย่างดี พร้อมความสามารถในการสังเกตการณ์และการเรียงลำดับการพึ่งพาที่ดีขึ้น

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
ในส่วนของการเปรียบเทียบระหว่าง Calendar timers และ Monotonic timers นั้น โดย Realtime timers จะใช้ OnCalendar= เพื่ออ้างอิงตามนาฬิกาจริงและเขตเวลา หากเครื่องคอมพิวเตอร์อยู่ในสถานะหลับ (sleep) ขณะที่อีเวนต์ปฏิทินนั้นผ่านพ้นไป systemd จะทำการเรียกใช้งานย้อนหลังให้ทันทีเมื่อเครื่องตื่นขึ้นมา โดยจะรันเพียงหนึ่งครั้งแม้ว่านิพจน์จะตรงกันหลายครั้งในช่วงที่หลับก็ตาม
การเปลี่ยนผ่านจาก cron มาสู่ systemd.timer ช่วยแก้ปัญหาความยุ่งยากในการตรวจสอบล็อกและการจัดการดีพนเดนซีที่ cron แบบเดิมทำได้ยาก ระบบ systemd ช่วยให้งานเบื้องหลังถูกผนวกเข้ากับระบบจัดการบริการหลักของ Linux อย่างสมบูรณ์ ทำให้การตั้งค่ามีความสอดคล้องกับโครงสร้างพื้นฐานของระบบมากขึ้น
สำหรับการตรวจสอบความถูกต้องของนิพจน์ก่อนนำไปใช้งานจริง สามารถใช้คำสั่ง systemd-analyze calendar เช่น การตรวจสอบรูปแบบรายวันหรือวันจันทร์เวลา 09:00 น. นอกจากนี้บนระบบที่ไม่มีแบตเตอรี่สำรองนาฬิกาฮาร์ดแวร์ ควรถเปิดใช้งาน systemd-time-wait-sync.service เพื่อให้ปฏิทินไทม์เมอร์รอการปรับเวลาให้ตรงกับเครือข่ายเสียก่อน
ในส่วนของพารามิเตอร์อย่าง AccuracySec= และ RandomizedDelaySec= ถึงแม้ชื่อจะคล้ายกันแต่ทำหน้าที่ต่างกัน โดย AccuracySec= ใช้กำหนดความแม่นยำของเวลา ส่วน RandomizedDelaySec= ใช้หน่วงเวลาแบบสุ่มเพื่อกระจายภาระงานในระบบที่มีโฮสต์จำนวนมาก เช่น การตั้งค่า fstrim.timer ที่ใช้ปฏิทินรายวัน ความแม่นยำ 1 ชั่วโมง และมีการหน่วงเวลาแบบสุ่มสูงสุด 100 นาทีพร้อมเปิดใช้งาน Persistent=true
หากตั้งค่า Persistent=true สำหรับปฏิทินไทม์เมอร์ systemd จะทำการบันทึกประทับเวลาการเรียกใช้งานครั้งล่าสุดไว้บนดิสก์ หากเครื่องคอมพิวเตอร์ปิดตัวลงในช่วงเวลาที่ควรจะรันงาน บริการนั้นจะถูกรันหนึ่งครั้งทันทีเมื่อตัวไทม์เมอร์ถูกเปิดใช้งาน โดยยังคงอยู่ภายใต้การควบคุมของ RandomizedDelaySec= เช่นเดิม
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น