วันพุธที่ 16 มีนาคม พ.ศ. 2554

Crontab on Linux

Crontab เป็นคำสั่งในระบบ Unix/Linux เพื่อใช้ในการรัน Program หรือ Script ตามเวลาที่กำหนด จะคล้ายกับเจ้า Scheduled Tasks ในระบบปฏิบัติการ Windows


เรามาดูรายละเอียดต่างๆกันดีกว่า


การใช้งาน crontab


     คำสั่งและ option ต่างๆ ของ contrab
$crontab filename      เป็นการนำคำสั่งของ crontab เข้ามาจาก filename
$crontab -e              การแก้ไข crontab ปัจจุบันของ user ที่ login ปัจจุบัน
$crontab -l               ดูคำสั่ง crontab ทั้งหมดที่มีอยู่ ของ User
$crontab -r                     ลบคำสั่ง crontab ของ User 
$crontab -u user             เป็นคำสั่งของผู้ดูแลระบบ(root) เท่านั้น ใช้ ดู แก้ไข ลบ crontab ของ user แต่ล่ะคน 



การใช้คำสั่ง $crontab -e เพื่อการแก้ไข crontab
หลังจากรันคำสั่ง $crontab -e แล้วจะปรากฏหน้า editor ขึ้นมาเพื่อแก้ไข crontab การแก้ไข crontab จะมีลักษณะการใช้งานคล้ายกับโปรแกรม vi โดยมีโหมดและคำสั่งต่างๆดังนี้


โหมดการทำงาน และคำสั่งในการแก้ไข crontab 
    Esc       เพื่อออกมาสู่โหมดปกติ

    i           โหมดการแก้ไขข้อความ เพื่อการเพิ่ม ลบ เปลี่ยนแปล คำสั่ง ข้อความ ต่างๆ 
    x          ลบตัวอักษรที่ cursor วางอยู่ ทีละอักษร ในโหมดปกติ

    dd        ลบบรรทัด ทั้งบรรทัด ที่ cursor วางอยู่ทีละแถว ในโหมดปกติ

   :q!        ออกโดยไม่ต้องบันทึกการเปลี่ยนแปลงต่างๆใน crontab

   :wq!      บันทึกการแก้ไขข้อความที่ถูกแก้ไขใน crontab แล้วออกจากโปรแกรม 
คำสั่งดังกล่าวข้างต้นเป็นเพียงตัวอย่างคำสั่ง สามารถดูรายละเอียดเพิ่มเติม การใช้งาน vi หรือดู manual ได้จากคำสั่ง $man vi 


format ของ crontab 
minute(s) hour(s) day(s) month(s) weekday(s) command(s) 
format ของ crontab จะประกอบด้วยสองส่วนหลักๆ คือ การกำหนดวันเวลาในการรันโปรแกรม หรือscript


Field                        มีค่า          รายละเอียด
################################################################

minute                     0-59          เวลาเป็นนาที จะสั่งให้คำสั่งที่กำหนดทำงานทันทีเมื่อถึง (*) จะรันคำสั่งทุกๆนาที

hour                        0-23          เวลาเป็นชั่วโมง จะสั่งให้คำสั่งที่กำหนดทำงานทันทีเมื่อถึง 
(*) จะรันคำสั่งทุกๆ ชั่วโมง

day                          1-31          เวลาเป็นวัน จะสั่งให้คำสั่งที่กำหนดทำงานทันทีเมื่อถึง 
(*) จะรันคำสั่งทุกๆ วัน

month                      1-12          เวลาเป็นเดือน จะสั่งให้คำสั่งที่กำหนดทำงานทันทีเมื่อถึง 
(*) จะรันคำสั่งทุกๆ เดือน

weekday                  0-6            วันของแต่ละสัปดาห์ มีค่าดังนี้ (อาทิตย์ = 0, จันทร์ = 1, อังคาร = 2, พุธ = 3, พฤหัส = 4, ศุกร์ = 5 และ เสาร์ = 6)
(*) จะรันคำสั่งทุกๆ วันในสัปดาห์

command                 คำสั่ง          สามารถกำหนดได้ว่าจะเป็นการรันคำสั่งโดยตรงหรือ ให้เรียก shell script ต่างๆ
###############################################################
 ตัวอย่าง crontab
เพิ่ม crontab โดยการใช้คำสั่ง crontab -e เมื่อเข้าสู่หน้าจอ editor จากนั้น กด i เพื่อแก้ไขข้อความ หลังจากแก้ไขข้อความเรียบร้อยแล้ว บันทึกการแก้ไขและออกจากการแก้ไข crontab
0 8 * * * ls -l / >/list.txt
 อธิบาย จากคำสังข้างบนเป็นการสั่งให้รัน commant ls -l / >/list.txt ในเวลา 8.00 ของทุกๆวัน
0 8 * * 1 ls -l / >/list.txt
  อธิบาย จากคำสังข้างบนเป็นการสั่งให้รัน commant ls -l / >/list.txt ในทุกวันจันทร์ เวลา 8.00 ของทุกเดือน


0 8 * * 1,3,5 ls -l / >/list.txt
  อธิบาย จากคำสังข้างบนเป็นการสั่งให้รัน commant ls -l / >/list.txt ในทุกวันจันทร์ พุธ และศุกร์ เวลา 8.00 ของทุกเดือน

วิธีการดู manual ของคำสั่งต่างๆ
man crontab

man cron
อันนี้เป็นตัวอย่างที่ผมได้นำมาใช้งานจริง 
เป็น backup MySQL Database Server 
โดยคำสั่งในการ Backup ฐานข้อมูลคือ  
 $mysqldump -h HOST -u USER -pPASSWORD DATABASE TABLE
|
gzip > /tmp/table.`date +"\%Y-\%m-\%d"`.gz 
คำสั่งข้างบนเป็นรูปแบบที่ผมใช้ จะขออธิบายค่าต่างๆที่ต้องระบุ เพื่อใช้ในการ backup


HOST คือ Database Server อาจจะระบุเป็น IP หรือ Domain Name Sever
USER คือ ชื่อผู้ใช้ในการเข้าใช้งานฐานข้อมูล SQL Server
PASSWORD คือ รหัสผ่านสำหรับ User
DATABASE คือ ชื่อฐานข้อมูล
TABLE คือ ชื่อตาราง
/tmp/table.`date +"\%Y-\%m-\%d"`.gz  คือการกำหนดชื่อไฟล์เช่น table2011-01-03.gz โดยเก็บไว้ที่ path /tmp


ตัวอย่างการแก้ไข crontab หลังจากใช้คำสั่ง crontab -e แล้วกด i 
0 0 * * * /usr/bin/mysqldump -h localhost -u root -pp@ssword --all-database | gzip > /var/backup/database_`date +\%Y-\%m-\%d`.sql.gz


จากนั้นกด :wq เพื่อบันทึกและออกจากโปรแกรม
อธิบาย จากตัวอย่างเป็นการ backup ทุกฐานข้อมูลใน Database Server ในเวลา 24.00 ของทุกวันโดยตั้งชื่อไฟล์ต่างๆตามวันที่รันคำสั่ง