ทำไมต้องใช้ Cron?
Sysadmin ที่มีประสบการณ์รู้ดีว่างานบำรุงรักษาประจำ (Routine maintenance) ควรทำงานอัตโนมัติในพื้นหลัง Cron เป็นยูทิลิตี้ที่มีประสิทธิภาพสำหรับจัดตารางงาน (Schedule jobs) ตามเวลา/วันที่ที่กำหนดอย่างต่อเนื่อง
รูปแบบ Crontab (Crontab Format)
MIN HOUR DOM MON DOW CMD
| Field | คำอธิบาย | ค่าที่อนุญาต |
|---|---|---|
| MIN | นาที | 0 - 59 |
| HOUR | ชั่วโมง | 0 - 23 (24-hour format) |
| DOM | วันของเดือน | 1 - 31 |
| MON | เดือน | 1 - 12 |
| DOW | วันของสัปดาห์ | 0 - 6 (0 = Sunday, 7 = Sunday) |
| CMD | คำสั่งที่จะรัน | คำสั่ง Linux ใดๆ |
1. จัดตารางงานเวลาเฉพาะ (Specific Time)
รันสคริปต์ Full Backup (full-backup) วันที่ 10 มิถุนายน เวลา 08:30 น.
30 08 10 06 * /home/ramesh/full-backup
- 30 - นาทีที่ 30
- 08 - 08:00 น. (รูปแบบ 24 ชม.)
- 10 - วันที่ 10
- 06 - เดือนที่ 6 (มิถุนายน)
- * - ทุกวันของสัปดาห์
2. จัดตารางงานหลายครั้งต่อวัน (Multiple Instances)
รัน Incremental Backup (incremental-backup) สองครั้งต่อวัน ทุกวัน เวลา 11:00 และ 16:00
00 11,16 * * * /home/ramesh/bin/incremental-backup
- ใช้ Comma (,) แยกค่าใน Field เดียวกัน = รันทุกค่าที่ระบุ
3. จัดตารางงานในช่วงเวลาเฉพาะ (Time Range)
ทุกชั่วโมงในช่วงเวลาทำงาน (รวมเสาร์-อาทิตย์)
เช็คสถานะ Database ทุกชั่วโมง 09:00-18:00 ทุกวัน
00 09-18 * * * /home/ramesh/bin/check-db-status
- ใช้ Hyphen (-) ระบุช่วง = 09,10,11,12,13,14,15,16,17,18
เฉพาะวันจันทร์-ศุกร์ ในช่วงเวลาทำงาน
00 09-18 * * 1-5 /home/ramesh/bin/check-db-status
- 1-5 = Mon, Tue, Wed, Thu, Fri
4. ดู Crontab Entries
ดู Crontab ของ User ปัจจุบัน
crontab -l
ตัวอย่าง Output:
@yearly /home/ramesh/annual-maintenance */10 * * * * /home/ramesh/check-disk-space
ดู Crontab ของ Root
su - root crontab -l
ดู Crontab ของ User อื่น (ต้องเป็น Root)
crontab -u sathiya -l
5. แก้ไข Crontab Entries
แก้ไข Crontab ของ User ปัจจุบัน
crontab -e
จะเปิดใน Editor (ปกติคือ Vim) บันทึกด้วย :wq → จะขึ้น "crontab: installing new crontab"
แก้ไข Crontab ของ Root
su - root crontab -e
แก้ไข Crontab ของ User อื่น (ต้องเป็น Root)
crontab -u sathiya -e
6. จัดตารางงานทุกนาที (Every Minute)
* * * * * CMD
* = ทุกค่าที่เป็นไปได้ (ทุกนาที ทุกชั่วโมง ทุกวัน...) ทำความเข้าใจนี้ช่วยเข้าใจตัวอย่างอื่นๆ
*/5ใน Minute field = ทุก 5 นาที0-10/2ใน Minute field = ทุก 2 นาที ใน 10 นาทีแรก- รูปแบบนี้ใช้ได้กับ Field ทั้ง 5
7. จัดตารางงานทุก 10 นาที (Every 10 Minutes)
*/10 * * * * /home/ramesh/check-disk-space
รันทุก 10 นาทีตลอดปี หากต้องการเฉพาะช่วงเวลา ให้รวมกับ Range (เช่น */10 09-18 * * *)
8. คีย์เวิร์ดพิเศษ (Special Keywords) แทน 5 Fields
| Keyword | เทียบเท่า |
|---|---|
| @yearly | 0 0 1 1 * (1 มกราคม 00:00 ทุกปี) |
| @monthly | 0 0 1 * * (วันที่ 1 ทุกเดือน 00:00) |
| @weekly | 0 0 * * 0 (วันอาทิตย์ 00:00 ทุกสัปดาห์) |
| @daily | 0 0 * * * (ทุกวัน 00:00) |
| @hourly | 0 * * * * (ทุกชั่วโมง นาที 0) |
| @reboot | รัน 1 ครั้งเมื่อบูทเครื่อง |
9. รันทุกปี ด้วย @yearly
@yearly /home/ramesh/red-hat/bin/annual-maintenance
10. รันทุกเดือน ด้วย @monthly
@monthly /home/ramesh/suse/bin/tape-backup
11. รันทุกวัน ด้วย @daily
@daily /home/ramesh/arch-linux/bin/cleanup-logs "day started"
12. รันหลัง Reboot ด้วย @reboot
@reboot /home/ramesh/startup-script.sh
13. ปิด/เปลี่ยนทาง Email Output ด้วย MAIL Variable
ค่าเริ่มต้น Cron ส่ง Output ไปที่ User ที่ตั้ง Crontab
ส่งไป User อื่น:
MAIL="ramesh" @yearly /home/ramesh/annual-maintenance */10 * * * * /home/ramesh/check-disk-space
ไม่ส่ง Email (ปิดการแจ้งเตือน):
MAIL=""
14. รันทุกวินาที? (Every Second)
Cron ไม่รองรับทุกวินาที หน่วยเล็กที่สุดคือ นาที หากต้องการรันทุกวินาที ใช้ systemd timer หรือ while loop + sleep ในสคริปต์แทน
15. ตั้งค่า PATH Variable ใน Crontab
ปกติต้องระบุ Full path ของคำสั่ง/สคริปต์ หากต้องการใช้แค่ชื่อคำสั่ง:
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/home/ramesh @yearly annual-maintenance */10 * * * * check-disk-space
16. ติดตั้ง Crontab จากไฟล์ (Install from Cron File)
แทนที่จะ edit โดยตรง ให้สร้างไฟล์ cron-file.txt ก่อน:
cat cron-file.txt @yearly /home/ramesh/annual-maintenance */10 * * * * /home/ramesh/check-disk-space crontab cron-file.txt # ติดตั้ง (จะแทนที่ Crontab เดิมทั้งหมด!) crontab -l # ตรวจสอบ
⚠ ระวัง: คำสั่งนี้จะ ลบ Crontab เดิมทิ้ง ให้สำรองก่อน (crontab -l > backup.txt)
เคล็ดลับและ Best Practices
- ใช้ Absolute Path เสมอ: /home/user/script.sh ไม่ใช่ ./script.sh
- Redirect Output:
>/dev/null 2>&1หากไม่ต้องการ Log หรือ>/var/log/myscript.log 2>&1เพื่อเก็บ Log - ตั้งค่า Environment Variables: SHELL=/bin/bash, PATH, HOME ใน Crontab ให้ชัดเจน
- ทดสอบคำสั่งก่อน: รันคำสั่งด้วยมือก่อน ให้แน่ใจว่าทำงานถูกต้อง
- ใช้ Cron.d: สำหรับ System-wide cron jobs ให้สร้างไฟล์ใน
/etc/cron.d/แทน (จัดการง่ายกว่า) - Anacron: สำหรับเครื่องที่ไม่ได้เปิดตลอดเวลา (Laptop) ใช้ Anacron แทน Cron
บทความ Cron เพิ่มเติม
- Cron vs Anacron: ตั้งค่า Anacron บน Linux
- วิธีรัน Cron ทุก 5 นาที, วินาที, ชั่วโมง, วัน, เดือน
- 6 ตัวอย่างคำสั่ง Crontab
- ติดตั้ง แก้ไข ลบ Cron Jobs แบบ Batch Mode
- เข้าใจ at, atq, atrm, batch Commands