แม้ว่า systemd timers จะมีความทันสมัย แต่ cron และ anacron ยังคงเป็นมาตรฐานที่ติดตั้งมาพร้อมกับ Linux ทุกเครื่อง และมีความเรียบง่ายในการใช้งานสูงมาก บทความนี้จะเจาะลึกวิธีตั้งค่าให้งานทำงานอัตโนมัติด้วยเครื่องมือดั้งเดิมเหล่านี้ครับ
1. ปัญหาของ Cron แบบมาตรฐาน
cron ถูกออกแบบมาให้รันงานตามเวลาที่กำหนดเป๊ะๆ (Time-based job scheduler) แต่มีจุดอ่อนสำคัญคือ:
* ถ้าเครื่องปิด งานก็พลาด: หากกำหนดให้รันงานตอนตี 3 แต่คุณปิดคอมพิวเตอร์ไว้ งานนั้นจะไม่รันเลยจนกว่าจะถึงรอบถัดไป
* ไม่เหมาะกับ Desktop/Laptop: คอมพิวเตอร์ส่วนบุคคลมักไม่ได้เปิดทิ้งไว้ 24/7 ทำให้งานที่ตั้งไว้ใน crontab มักถูกข้ามไป
วิธีแก้: เราจึงต้องใช้ anacron เข้ามาช่วย ซึ่งถูกออกแบบมาให้รันงานที่ “พลาดไป” ทันทีที่เปิดเครื่องครับ
2. ขั้นตอนการตั้งค่า
วิธีที่ 1: ใช้ Cron (สำหรับงานที่ต้องรันตรงเวลา)
พิมพ์คำสั่งเพื่อแก้ไขตารางงานของคุณ:
bash
crontab -e
ในไฟล์นี้ ให้ใส่บรรทัดคำสั่งตามรูปแบบ: นาที ชั่วโมง วันที่ เดือน วันในสัปดาห์ คำสั่ง
วิธีที่ 2: ใช้ Anacron (สำหรับงานที่พลาดไม่ได้)
ระบบ Linux (เช่น Ubuntu/Debian) จะมีโฟลเดอร์สำหรับงานอัตโนมัติอยู่แล้วใน /etc/
* /etc/cron.daily/
* /etc/cron.weekly/
* /etc/cron.monthly/
เพียงแค่คุณนำสคริปต์ไปวางในโฟลเดอร์เหล่านี้ ระบบจะจัดการรันให้เองโดยอัตโนมัติเมื่อเครื่องเปิดอยู่
3. ตัวอย่างการตั้งค่า
ตัวอย่างใช้ Cron (รันสคริปต์สำรองข้อมูล)
“`bash
รันทุกวัน ตอนตี 3
0 3 * * * /home/user/backup.sh
รันทุกวันจันทร์ ตอน 8 โมงเช้า
0 8 * * 1 /home/user/weekly_report.sh
รันวันที่ 1 ของทุกเดือน ตอนเที่ยงคืน
0 0 1 * * /home/user/monthly_clean.sh
“`
ตัวอย่างการใช้ Anacron (ผ่านไฟล์ /etc/anacrontab)
ถ้าคุณต้องการสร้างงานรายวันเอง ให้ไปที่ /etc/anacrontab และเพิ่มบรรทัดนี้:
“`text
period(วัน) delay(นาที) job-identifier command
1 5 daily_backup /home/user/backup.sh
“`
หมายเหตุ: เลข 5 หมายความว่าให้รอ 5 นาทีหลังจากเปิดเครื่องก่อนเริ่มรันงาน เพื่อไม่ให้เครื่องหน่วงตอนเปิดเครื่องใหม่ๆ
4. ข้อควรระวัง
- Environment Variables:
cronไม่ได้โหลดค่า Environment เหมือนกับที่คุณเปิด Terminal ปกติ ดังนั้นในสคริปต์ของคุณ ต้องระบุ Path แบบเต็มเสมอ เช่น/usr/bin/python3แทนที่จะใช้python3หรือระบุ Path ของไฟล์ให้ชัดเจน (เช่น/home/user/script.shแทนที่จะใช้./script.sh) - สิทธิ์การเข้าถึง (Permission): อย่าลืมเปลี่ยนไฟล์สคริปต์ให้เป็นไฟล์ที่รันได้ (
chmod +x script.sh) - การจัดการ Output: งานที่รันโดย cron จะไม่มีหน้าจอให้คุณเห็น ถ้างานเกิด Error คุณจะไม่รู้เลย แนะนำให้เขียน Log ลงไฟล์เสมอ เช่น:
0 3 * * * /home/user/backup.sh >> /home/user/backup.log 2>&1
(เป็นการเก็บทั้ง Output ปกติและ Error ไว้ในไฟล์ .log) - อย่าตั้งเวลาซ้อนทับกัน: หากงานของคุณใช้ทรัพยากรสูง (เช่น สแกนไวรัสหรือบีบอัดข้อมูล) อย่าตั้งให้รันพร้อมกันหลายๆ งาน เพราะจะทำให้ระบบค้างได้
- การใช้ Anacron: อย่าลืมว่าถ้าคุณเอาไฟล์ไปวางใน
/etc/cron.daily/ไฟล์นั้น ต้องไม่มีจุด (.) ในชื่อไฟล์ (เช่น ห้ามตั้งชื่อว่าbackup.shให้ตั้งว่าbackup) มิฉะนั้น Debian/Ubuntu จะไม่รันไฟล์นั้นครับ
