IT General
น้องๆ เคยใช้ Cron job ใช่มั้ย? ไอ้ตัวที่ตั้งเวลาให้สคริปต์มันรันอัตโนมัติตามที่เรากำหนดน่ะ Systemd Timer ก็คล้ายๆ กันแหละ แต่เจ๋งกว่าตรงที่มันผูกติดกับ Systemd ซึ่งเป็น init system ที่ลีนุกซ์ส่วนใหญ่ใช้กันอยู่
สมัยผมทำร้านเน็ต SiamCafe เนี่ย Cron job คือพระเอกเลย ต้องคอยรันสคริปต์ backup ฐานข้อมูล, เคลียร์ temp file, หรือ restart service ต่างๆ ทุกคืน ทีนี้พอ server มันเยอะขึ้น การจัดการ Cron job มันเริ่มวุ่นวาย Systemd Timer เลยเข้ามาช่วยแก้ปัญหานี้ได้เยอะมาก
ทำไมถึงสำคัญ? เพราะ Systemd Timer มัน integrate กับ systemd ได้ดีกว่า ทำให้จัดการง่ายกว่า, มี logging ที่ละเอียดกว่า, และมีความยืดหยุ่นมากกว่า Cron แถมยัง monitor สถานะต่างๆ ได้ด้วย เจ๋งป่ะล่ะ?
ก่อนอื่นเลย ต้องรู้จัก Systemd Units ก่อน มันคือไฟล์ config ที่บอก Systemd ว่าจะให้ทำอะไร เช่น start service, mount filesystem หรือ run timer File config พวกนี้มักจะอยู่ใน /etc/systemd/system/ หรือ /usr/lib/systemd/system/
Unit file จะมีหลาย type เช่น .service (สำหรับ service), .mount (สำหรับ mount point), .timer (สำหรับ timer) เป็นต้น
Systemd Timer จะทำงานคู่กับ Service Unit Timer Unit จะเป็นตัวกำหนดเวลาว่าจะให้ Service Unit รันเมื่อไหร่ ส่วน Service Unit จะเป็นตัวบอกว่าต้องทำอะไร เช่น รันสคริปต์ หรือ restart service
คิดง่ายๆ Timer คือนาฬิกา ส่วน Service คือคนงาน Timer สั่งให้คนงานทำงานตามเวลาที่กำหนด
เริ่มจากสร้าง Timer Unit file กับ Service Unit file ก่อนเลย น้องๆ ลองดูตัวอย่างด้านล่างนี้
สมมติว่าเราต้องการรันสคริปต์ /opt/backup.sh ทุกวันตอนตี 3 ให้สร้างไฟล์ /etc/systemd/system/backup.service แล้วใส่ code นี้เข้าไป:
[Unit]
Description=Backup Script
[Service]
Type=oneshot
ExecStart=/opt/backup.sh
Type=oneshot หมายความว่า Service จะรันแค่ครั้งเดียวแล้วจบ
จากนั้นสร้างไฟล์ /etc/systemd/system/backup.timer แล้วใส่ code นี้เข้าไป:
[Unit]
Description=Run Backup Script Daily
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
OnCalendar=*-*-* 03:00:00 หมายความว่าให้รันทุกวันตอนตี 3
Persistent=true หมายความว่าถ้าเครื่องดับไป แล้วถึงเวลารันพอดี พอกลับมาเครื่องจะรันทันที
WantedBy=timers.target หมายความว่า Timer นี้จะถูก start เมื่อ timers.target start
หลังจากสร้างไฟล์เสร็จแล้ว ให้ enable และ start timer ด้วยคำสั่ง:
sudo systemctl enable backup.timer
sudo systemctl start backup.timer
แค่นี้ Timer ของเราก็พร้อมทำงานแล้ว น้องๆ สามารถตรวจสอบสถานะของ Timer ได้ด้วยคำสั่ง systemctl status backup.timer
แน่นอนว่า Systemd Timer ไม่ใช่ทางเลือกเดียว ยังมี Cron, Anacron, และ at command ที่ทำหน้าที่คล้ายๆ กัน แต่ละตัวก็มีข้อดีข้อเสียต่างกัน
| Feature | Cron | Systemd Timer | Anacron |
|---|---|---|---|
| Dependency Management | No | Yes | No |
| Logging | Basic | Detailed | Basic |
| Missed Job Handling | Sometimes Missed | Persistent Option | Designed for Missed Jobs |
| Complexity | Simple | Moderate | Simple |
| Integration with System | Limited | Full Integration | Limited |
Cron เหมาะสำหรับงานง่ายๆ ที่ไม่ต้องการ dependency management หรือ logging ที่ละเอียด Anacron เหมาะสำหรับงานที่ต้องรันแม้เครื่องจะดับไป Systemd Timer เหมาะสำหรับงานที่ต้องการความยืดหยุ่น, dependency management, และ logging ที่ละเอียด
น้องๆ ลองเลือกใช้ตามความเหมาะสมของงานนะครับ สมัยผมทำร้านเน็ตก็ใช้ผสมๆ กันไป ทั้ง Cron และ Systemd Timer SiamCafe Blog มีบทความอื่นๆ ที่น่าสนใจอีกเยอะ ลองเข้าไปอ่านดูได้นะ
ถ้าอยากรู้เรื่อง IT เพิ่มเติม ลองแวะไปดู SiamCafe Blog ได้เลย
เอาล่ะน้องๆ มาถึงส่วนสำคัญที่เราจะคุยกันถึง Best Practices หรือเคล็ดลับที่พี่บอมสั่งสมมาจากการใช้งาน Systemd Timer จริงๆ จังๆ สมัยทำร้านเน็ต SiamCafe นะ สมัยนั้น Cron ก็ใช้ แต่พอเจอ Systemd Timer ชีวิตมันง่ายขึ้นเยอะ
สมัยก่อนตอนใช้ Cron พี่เจอปัญหาประจำเลย คือพอมี Job เยอะๆ แล้วงง ว่าอันไหนทำอะไร แก้ปัญหานี้ได้ง่ายๆ ด้วยการตั้งชื่อ Timer และ Service ให้มันสื่อความหมาย บอกได้เลยว่าทำอะไร เช่น backup-database.timer และ backup-database.service แบบนี้อ่านปุ๊บรู้เลย
# backup-database.timer
[Unit]
Description=Daily database backup
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
Persistent=true ถ้าจำเป็นPersistent=true นี่สำคัญมากนะน้องๆ โดยเฉพาะงานที่ต้องทำทุกวัน หรือทำเป็นช่วงเวลา ถ้าเครื่องดับไปแล้ว Timer มันจะจำได้ว่าต้องรันอีกรอบเมื่อไหร่ เหมาะสำหรับงานที่พลาดไม่ได้ เช่น Backup ข้อมูล หรืออัพเดท Software พี่เคยเจอลูกค้าบ่นว่าข้อมูลหาย เพราะ Cron ไม่ทำงานตอนเครื่องดับไปนานๆ พอใช้ Systemd Timer แก้ปัญหาได้เลย
systemctl start และ systemctl list-timersอย่าเพิ่งมั่นใจว่า Timer เราจะทำงานตามที่เราตั้งใจไว้เสมอไปนะน้องๆ หลังจากสร้าง Timer และ Service แล้ว ให้ทดสอบด้วย systemctl start [ชื่อ Timer] แล้วเช็คด้วย systemctl list-timers ว่า Timer มันทำงานจริงๆ และกำหนดเวลาถูกต้องไหม พี่เคยพลาดมาแล้ว ปล่อยให้ Timer รันผิดเวลาไปหลายวัน เพราะไม่ได้ Test ก่อน
อย่าลืมดู Log ไฟล์ของ Service ที่ Timer เรียกใช้นะน้องๆ เพราะบางที Timer มันทำงาน แต่ Service มัน Fail ก็มี วิธีการดู Log ก็ง่ายๆ ใช้คำสั่ง journalctl -u [ชื่อ Service] หรือถ้าอยากดู Log แบบ Real-time ก็ใช้ journalctl -f -u [ชื่อ Service] พี่เคยเจอเคส Service รันไม่สำเร็จ เพราะ permission ไม่ถูกต้อง พอมาดู Log ก็รู้เลยว่าต้องแก้ตรงไหน
journalctl -u backup-database.service
อันนี้เจอบ่อยมาก ลองเช็คก่อนเลยว่า Timer และ Service เปิดใช้งาน (enabled) หรือยัง ด้วยคำสั่ง systemctl is-enabled [ชื่อ Timer] ถ้ายังไม่ได้ Enable ก็สั่ง systemctl enable [ชื่อ Timer] เลย
ถ้า Timer ทำงานซ้ำๆ ทั้งๆ ที่ตั้งไว้แค่ครั้งเดียว ให้เช็คดูว่ามี Timer ที่ซ้ำกันอยู่หรือเปล่า หรืออาจจะเป็นปัญหาของ Service ที่รันเองซ้ำๆ ก็ได้
Systemd Timer รองรับการตั้งเวลาที่ซับซ้อนได้เยอะมาก ลองศึกษาจาก Manual ของ systemd.time ดูนะน้องๆ จะมีรูปแบบการตั้งเวลาให้เลือกใช้เยอะแยะเลย
ถ้างานนั้นสำคัญ ห้ามพลาด และเครื่องอาจจะดับได้ พี่แนะนำให้ใช้ Persistent=true ไปเลย แต่ถ้าเป็นงานที่ไม่ซีเรียสมาก ก็ไม่ต้องใช้ก็ได้
Systemd Timer เป็นเครื่องมือที่ทรงพลังในการจัดการงานอัตโนมัติบน Linux พี่ว่ามันใช้งานง่ายกว่า Cron แถมยังมีความสามารถที่ Cron ไม่มีอีกด้วย ลองเอาไปปรับใช้กันดูนะน้องๆ รับรองชีวิตง่ายขึ้นเยอะเลย
ถ้าอยากรู้เรื่อง Forex เพิ่มเติม แวะไปดูได้ที่ iCafeForex นะครับ เผื่อสนใจลงทุน
และอย่าลืมติดตามบทความดีๆ เกี่ยวกับ IT ได้ที่ SiamCafe Blog นะครับ