Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เชี่ยวชาญ Linux Crontab: 15 ตัวอย่าง Cron Job สำหรับการจัดตารางงานอัตโนมัติ

ทำไมต้องใช้ 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เทียบเท่า
@yearly0 0 1 1 * (1 มกราคม 00:00 ทุกปี)
@monthly0 0 1 * * (วันที่ 1 ทุกเดือน 00:00)
@weekly0 0 * * 0 (วันอาทิตย์ 00:00 ทุกสัปดาห์)
@daily0 0 * * * (ทุกวัน 00:00)
@hourly0 * * * * (ทุกชั่วโมง นาที 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