ถาม:
วิธีใช้ Systemd Timers ทำงานรายวัน รายสัปดาห์ รายเดือน อัตโนมัติทำยังไง
ตอบ:
การทำงานอัตโนมัติ (Automation) บน Linux มักจะทำผ่าน cron เป็นหลัก แต่ systemd timers เป็นทางเลือกที่ทันสมัยกว่า มีความสามารถในการจัดการ Log, การตรวจสอบสถานะ และการจัดการทรัพยากรที่ดีกว่ามาก
บทความนี้จะสอนวิธีใช้ Systemd Timers แทน Cron เพื่อรันงานรายวัน รายสัปดาห์ และรายเดือนครับ
1. ปัญหาของ Cron
แม้ cron จะใช้งานง่าย แต่มีข้อจำกัดหลายอย่าง:
* ตรวจสอบยาก: การดู Log ของงานที่รันผ่าน cron ทำได้ค่อนข้างยาก
* Dependency: ไม่สามารถจัดการลำดับความสำคัญของ Service ได้ดีนัก
* การจัดการทรัพยากร: ควบคุมการใช้ CPU/RAM ของงานนั้นๆ ได้จำกัด
* ความยืดหยุ่น: หากเครื่องปิดอยู่ตอนถึงเวลาที่ต้องรันงาน cron ส่วนใหญ่จะข้ามรอบนั้นไปเลย
2. ขั้นตอนการตั้งค่า Systemd Timers
การสร้าง Timer ใน Systemd ต้องใช้ไฟล์คู่กัน 2 ไฟล์เสมอ:
1. Service File (.service): ระบุว่า “จะทำอะไร”
2. Timer File (.timer): ระบุว่า “จะทำเมื่อไหร่”
ขั้นตอนการสร้าง:
- สร้าง Service File: ไปที่
/etc/systemd/system/mytask.service
“`ini
[Unit]
Description=My Task Service
[Service]
ExecStart=/usr/bin/python3 /path/to/script.py
“`
- สร้าง Timer File: ไปที่
/etc/systemd/system/mytask.timer
“`ini
[Unit]
Description=Run mytask daily/weekly/monthly
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
“`
- Reload และสั่งงาน:
bash
sudo systemctl daemon-reload
sudo systemctl enable --now mytask.timer
3. ตัวอย่างการตั้งเวลา (OnCalendar)
หัวใจสำคัญคือค่า OnCalendar ซึ่งยืดหยุ่นมาก:
- รายวัน:
OnCalendar=daily(รันเวลา 00:00:00 ทุกวัน) - รายสัปดาห์:
OnCalendar=weekly(รันทุกวันจันทร์ 00:00:00) - รายเดือน:
OnCalendar=monthly(รันวันที่ 1 ของเดือน 00:00:00) - ระบุเวลาเฉพาะ:
OnCalendar=*-*-* 03:00:00(รันทุกวันตอนตี 3) - ระบุวันในสัปดาห์:
OnCalendar=Mon..Fri *-*-* 09:00:00(รันจันทร์-ศุกร์ ตอน 9 โมงเช้า)
4. ข้อควรระวัง (Best Practices)
- Persistent=true: สำคัญมาก! หากคุณตั้งค่านี้เป็น
trueและเครื่องปิดอยู่ตอนถึงเวลารัน เมื่อเปิดเครื่องขึ้นมา Systemd จะรันงานนั้น “ทันที” เพื่อชดเชยรอบที่พลาดไป - ใช้ Absolute Path: ในไฟล์ Service ให้ใช้ Path เต็มเสมอ (เช่น
/usr/bin/python3แทนที่จะใช้แค่python3) เพราะ Systemd ไม่ได้ใช้ environment variable เดียวกับ shell ของคุณ - การตรวจสอบสถานะ: คุณสามารถดูสถานะและประวัติการรันได้ด้วยคำสั่ง:
systemctl list-timers(ดูรายการ Timer ทั้งหมด)journalctl -u mytask.service(ดู Log การรันของงานนั้น)- User vs System: หากคุณเป็น User ปกติและไม่อยากยุ่งกับไฟล์ใน
/etc/systemd/system/คุณสามารถสร้าง Timer ไว้ที่~/.config/systemd/user/ได้เช่นกัน (ไม่ต้องใช้ sudo) - ความซับซ้อน: หากงานของคุณไม่ได้ต้องการความซับซ้อนของ Systemd (เช่น แค่ copy ไฟล์ง่ายๆ)
cronอาจจะยังเป็นตัวเลือกที่เร็วกว่า แต่ถ้าเป็นงาน Production ที่ต้องการ Log และความเสถียรSystemd Timersคือคำตอบที่ดีที่สุดครับ
