19 April 2012

การตั้งเวลาด้วย crontab บน ubuntu


crontab คืออะไร crontab เป็น simple text file ที่ประกอบด้วยรายการคำสั่งที่จะให้รันตามเวลาที่กำหนด โดยคำสั่งดังกล่าวจะสัมพันธ์กับเวลาในการรัน ที่ถูกควบคุมจาก cron daemon และถูก executed ใน system's background ข้อมูลเพิ่มเติมเกี่ยวกับ crontab สามารถดูได้จาก crontab's man page

crontab ทำงานอย่างไร
ระบบจะรักษา (maintain) crontab ของแต่ละ user ไว้ในระบบ การแก้ไขหรือสร้าง crontab คุณจะต้องใช้ text editor ที่ระบบได้กำหนดไว้แล้ว โดย nono text editor เป็น default text editor บนระบบ ubuntu ของผู้เีขียนที่ใช้ทดลอง ซึ่ง text editor ดังกล่าวนี้จะต้องเปิดขึ้นมาด้วยคำสั่ง crontab ที่ใช้ option เป็น -e (crontab -e) โดยการสร้าง crontab ให้ใ้ช้คำสั่งดังนี้ :
#crontab -e
เมื่อใช้คำสั่ง crontab -e ระบบจะเปิด nano text editor ขึ้นมาเป็น blank window เพื่อให้เราป้อนเวลาและคำสั่ง สำหรับการตั้งเวลาดังรูปข้างล่าง โดยแต่ละบรรทัดจะแทน separate crontab entry ที่รู้จักกันในชื่อ "cron job" ถ้าคุณไ่ม่คุ้นเคยกับ nono text editor คุณควรจะศึกษาข้อมูลเพิ่มเติมจากแหล่งข้อมูลนอกเหนือจากที่นี้

Crontab Sections
แต่ละ section จะถูกแยกโดยหนึ่งช่องว่าง (space) ซึ่งในส่วนของ section สุดท้าย (command section) จะมี space เป็น 1 space หรือมากกว่า   ทั้งนี้จะไม่อนุญาตให้มี space มากกว่า 1 space ระหว่าง section 1-5  โดย section  1-5 จะถูกใช้เพื่อแสดงว่างาน (task) จะถูก executed เป็นเวลาบ่อยแค่ไหน โดยรูปแบบของ cron job จะเป็นดังนี้ :
minute (0-59), hour (0-23, 0 = midnight), day (1-31), month (1-12), weekday (0-6, 0 = Sunday), command
รุปแบบที่ 1
01 04 1 1 1 /usr/bin/somedirectory/somecommand
หมายถึงจะมีการรันคำสั่ง /usr/bin/somedirectory/somecommand ที่เวลา 4:01am ในวันที่ 1 ที่เป็นวันจันทร์ของเดือนมกราคม
 เราสามารถใช้เครื่องหมาย * เพื่อแทนความหมาย "ทุก ๆ" (ทุกนาที, ทุกชั่วโมง,ทุกวัน, ทุกเดือน, ทุกวันของสัปดาห์)
รูปแบบที่ 2
01 04 * * * /usr/bin/somedirectory/somecommand
หมายถึงจะมีการรันคำสั่ง /usr/bin/somedirectory/somecommand ที่เวลา 4:01am ทุก ๆ วันของทุก ๆ เดือน
เราสามารถใช้คอมม่า (,) เพื่อให้มีการรันกมากว่า 1 instance ของคำสั่งภายในช่วงเวลา  และใช้เครื่องหมาย dash (-) เพื่อแทนคำสั่งที่ต่อเนื่องได้
รูปแบบที่ 3 
01,31 04,05 1-15 1,6 * /usr/bin/somedirectory/somecommand
หมายถึงจะมีการรันคำสั่งที่นาทีที่ 1 และ 31 ถัดจากเวลา 4:00am และ 5:00am (4:01am, 4:31am, 5:01am, 5:31am) ในวันที่ 1-15 ของเดือนมกราคมและมิถุนายน
ข้อความ "/usr/bin/somedirectory/somecommand" จากที่กล่าวมาแสดงถึงงาน (task) ที่จะรัน ณ เวลาที่กำหนด ซึ่งมีการแนะนำว่าควรจะเป็น full path command ดังรูปแบบที่กล่าวมา โดย crontab จะเริ่มรันคำสั่งทันทีเมื่อการแ้ก้ไข (crontab -e) ถูกต้องและมีการบันทึกแล้ว
Crontab Options
crontab -l : แสดง crontab ที่มีอยู่
crontab -r : เป็นการลบ crontab ที่มีอยู่
crontab -e : เป็นการแก้ไข crontab ที่มีอยู่  ผ่าน editor ที่ถูกระบุไว้ใน environment variables ซึ่งในที่นี้เป็น nano editor

หลังจากที่ exit ออกจาก editor แล้ว crontab ที่เราแก้ไขจะถูกตรวจสอบความถูกต้องจากระบบ และถ้าไม่มีความผิดพลาด ก็จะถูกติดตั้งโดยอัตโนมัติ

Crontab Example
ตัวอย่างที่ 1 
45 04 * * * /usr/sbin/chkrootkit && /usr/bin/updatedb
หมายถึงเป็นกำหนดให้ crontab มีการรัน updatedb ซึ่งจะเป็นการอัพเดต slocate database ทุก ๆ เช้าเวลา 4:45am  วิธีการทำก็คือให้พิมพ์คำว่า crontab -e และพิมพ์ข้อความหนึ่งบรรทัดดังกล่าวใต้บรรทัิดต่อไปนี้ :
# m h dom mon dow command
แล้วให้บันทึกการแก้ไขและออกจาก editor
ถ้าเรากำหนด crontab ไม่ถูกต้องตามรูปแบบจะมีข้อความฟ้องดังตัวอย่างดังนี้ :
"/tmp/crontab.P7vQuf/crontab":2: bad day-of-month
errors in crontab file, can't install.
Do you want to retry the same edit?
เราสามารถใช้ double-ampersand (&&) ในส่วนของ command section เพื่อรันคำสั่งหลาย ๆ คำสั่งที่ติดต่ีอกัน (consecutively) ได้
ตัวอย่างที่ 2
45 04 * * * /usr/sbin/chkrootkit && /usr/bin/updatedb 
หมายถึงเป็นการรัน chkrootkit และ updatedb ทีุ่เวลา 4:45am ของทุกวัน


Code: 

0 8 * * * /usr/bin/mplayer /home/tuxzilla/music/คุณครูครับ.mp3 

จากคำสั่งด้านบนจะเป็นการสั่งให้โปรแกรม mplayer เล่นเพลง คุณครูครับ.mp3 ตอน 08:00 น. ของทุกๆวัน (เวลาตื่นนอนของผมเอง) 


Code: 

0 0 * * 1 /home/tuxzilla/getlogs.pl 

จากคำสั่งด้านบน จะทำการ Run script getlogs.pl ที่ path /home/tuxzilla ทุกวันจันทร์ ทุกๆเดือน ตอนเที่ยงคืน 


Code: 

0 0 * * 1,5 /home/tuxzilla/getlogs.pl 

 คำสั่งนี้เหมือนคำสั่งด้านบนครับ แต่จะเพิ่มการทำงานในวันศุกร์ด้วย ซึ่งเราสามารถใช้ "," คั่นไปเรื่อยๆได้ เพื่อที่จะกำหนดเพิ่มให้แต่ล่ะ fields หรือใช้ "*" 

เพื่อการกำหนดเป็นทั้งหมด(หมายความว่า หากที่ field ชั่วโมง เป็น * ก็หมายความว่าต้องทำงานทุกชั่วโมง)

#   m   h   dom   mon   dow   command
 
*** อธิบายเพิ่มเติมครับ ***
...................................................................................................................................................................................................
Field                                        มีค่า                                        รายละเอียด
...................................................................................................................................................................................................
m(minute)                    0-59 เวลาเป็นนาที               จะสั่งให้คำสั่งที่กำหนดทำงานทันทีเมื่อถึง
h(hour)                         0-23 เวลาเป็นชั่วโมง            จะสั่งให้คำสั่งที่กำหนดทำงานทันทีเมื่อถึง
dom(day of month)       1-31 เวลาเป็นวัน                 จะสั่งให้คำสั่งที่กำหนดทำงานทันทีเมื่อถึง
mon(month)                 1-12 เวลาเป็นเดือน              จะสั่งให้คำสั่งที่กำหนดทำงานทันทีเมื่อถึง
dow(day of week)          0-6 วันของแต่ละสัปดาห์        มีค่าดังนี้(อาทิตย์=0,จันทร์=1,...,เสาร์=6)
command                     คำสั่ง                                  เราสามารถกำหนดคำสั่งหรือ script ที่ต้องการรันลงไปได้ ...................................................................................................................................................................................................
 
step 2: เขียนคำสั่งลงไป เช่น
 
# m   h   dom   mon   dow    command
 
   
0    0      *          *       *        /home/rooney/backup.sh

No comments:

Post a Comment