2007年7月17日 星期二

LPI心得筆記簿 ─ 工作排程(Cron)

對於利用電腦處理一些例行性工作的人,這個功能一定要會使用,在Windows XP 當中可以利用控制台 --> 排定的工作,接著就只要跟著說明的引導來設計例行性工作的排程即可,如此一來就可以設定啟動時間、下次執行時間、執行結果...等說明

在Linux中當然也有類似的功能,那就是cron這支程式(服務)來控管,不過在Linux中要利用cron來編寫工作排程,最好是搭配Shell Script來使用,否則可能會有某些排程的指令會寫的很長一段,如果要偵錯的話,也比較不方便!

當然,在Windows中也是可以利用dos的語法來編寫一個可執行檔(*.exe、*.bat...等),再把這隻程式放入排程當中,一樣能夠達到預期的效果,只是對於使用上的嚴謹程度來說,Linux比Windows還多了許多的限制,當然也有他的強處

在進入cron之前,要先介紹兩個機制,其實他就類似最簡單的權限管制,代表誰能夠使用cron、或是誰不能使用cron這隻程式

除此之外,在Linux中相當重要的一點就是,所有規則描述都是由上往下,如果在上層已經通過該規則後,就不會再對下一層做判斷的動作,為什麼要特別聲明這一點呢?

因為除了cron本身之外,還有cron.allow(/etc/cron.allow)和cron.deny(/etc/cron.deny)這兩個設定檔來判斷誰能使用cron這隻程式,而判斷的順序如下:



假設,在cron.allow和cron.deny中都有使用者test的id,因為那是沒有意義的,在經過cron.allow之後,test就會被允許使用,而不會因為cron.deny也有test而無法使用,這是在Linux中常見的規則錯誤

接著,我們來看看如何使用cron這程式:

cron的設定檔:/etc/crontab(會多一個使用者欄位)
cron的暫存檔:/var/spool/cron
cron的使用指令
(1)編輯:crontab -e (crontab -u "username" -e:user的crontab)
(2)列出:crontab -l
(3)刪除:crontab -r(清空該使用者的所有cron排程)
cron的設定規則
(1)欄位說明:
   分 時 日 月 星期 command
   * * * * *(1~7) 語法編寫(*每單位時間都會執行)
(2)實例說明:
  1. 每一分鐘做echo的指令(echo a的結果導向至家目錄的testcron檔)
   * * * * * echo a >> ~/testcron
  2. 每天的00:00做tmp的備份(利用tar打包/tmp資料夾)
   0 0 * * * tar czrf etc.tgz /tmp
  3. 其它標示法:
   20 8,17 * * * command(每8、17:20分執行command)
   */10 * * * * command(每10分執行command)

以上就是cron的使用方式,至於要如何活用,取決於自己怎麼安排工作的排程,通常都會把時間點設定在較少人執行程式的時間(深夜時段)

筆者在Linux的異地備份(1)中使用crontab的時間點就是在深夜的00:00,而且筆者是把命令語法改為Shell Script的方式,未來要更改排程內容時就只需要更動該Script即可

筆者在此寫個小小的範例:(需注意sh的可執行權限)

backup.sh的內容:
#!/bin/bash
rsync -av /tmp root@192.168.1.99:/home/tmp/
rsync -av /home/test test@192.168.1.99:/home/test/

crontab -e的內容:
0 0 * * * /0000/backup.sh