本文主要基於以下英文文檔:http://www.adminschoice.com/docs/crontab.htm.
cron是一個UNIX工具,使用cron後台進程使得任務能夠以後台方式在特定時間自動執行。這些任務通常叫做cron jobs. crontab是一個包括在特定時間要啟動並執行cron記錄的
1.Crontab限制:
如果你的名字出現在/usr/lib/cron/cron.allow,你可以執行crontab.如果那個檔案不存在,而你的名字又沒有在/usr/lib/cron/cron.deny中出現,你也可以使用crontab.如果只有cron.deny存在,而且是空檔案,那麼所有使用者都可以使用crontab.如果兩個檔案都不存在,那麼只有root使用者可以使用crontab.all/deny檔案每行一個使用者名稱。
2.crontab命令:
首先需要指定一個編輯器來開啟crontab檔案,通常使用vi.
crontab -e:編輯你的crontab檔案或者當它不存在時建立一個。
crontab -l:顯示你的crontab檔案。
crontab -r:刪除你的crontab檔案。
3.crontab檔案文法:
* * * * * command to be executed
- - - - -
| | | | |
| | | | +----- day of week (0 - 6) (Sunday=0)
| | | +------- month (1 - 12)
| | +--------- day of month (1 - 31)
| +----------- hour (0 - 23)
+------------- min (0 - 59)
上面value域中的*表示所有該列括弧中的合法值。value列可以是一個*,也可以是使用逗號隔開的一組元素。所有列的元素要麼是上述範圍的的一個數字,要麼是被分割符(-)分開的上述範圍內的兩個數字(表示一個左右閉合域)。
日期的指定可以在兩個域中:month day和week day.如果兩個在一條記錄中都指定,那麼他們是兩個記錄的累計效果。
4.crontab樣本
下面crontab檔案中的一列在18:30從/home/someuser/tmp中移除臨時檔案:
30 18 * * * rm /home/someuser/tmp/*
如下所示改變參數會使得該命令按照不同的時間計劃執行:
min |
hour |
day/month |
month |
day/week |
Execution time |
30 |
0 |
1 |
1,6,12 |
* |
1月,6月和12月的1日的00:30分執行 |
0 |
20 |
* |
10 |
1-5 |
10月份的每個工作日(周一至周五)的20:點執行 |
0 |
0 |
1,10,15 |
* |
* |
每個月的1,10,15日午夜執行 |
5,10 |
0 |
10 |
* |
1 |
每個星期一以及每個月的10號,在00:05與00:10執行 |
5.Crontab環境
cron從使用者的HOME目錄,使用/usr/bin/sh來調用命令。
cron為每個shell提供一個預設的環境,定義如下:
HOME=user's-home-directory
LOGNAME=user's-login-id
PATH=/usr/bin:/usr/sbin:.
SHELL=/usr/bin/sh
如果使用者希望他們的.profile被執行,則必須顯式的在crontab的命令指令碼中執行,或者在一個單獨的指令碼中,這個單獨的指令碼被crontab命令指令碼調用。
6.Disable Email
在命令列下輸出到螢幕上的資訊在使用crontab時會寫入到mail中,如果不需要,將下面命令放到crontab的cron job line的末尾。
備忘:在UNIX上使用>/dev/null運行一個程式時可以屏蔽掉程式向stdout的輸出,然而如果程式也有向stderr的輸出時,仍然會將向stderr輸出的資訊顯示到螢幕上。常用的一種屏蔽stderr的方法是使用管道,把stderr也輸出到stdout,而stdout輸出到/dev/null中。一般有如下寫法:proc >/dev/null 2>&1.這種方法僅適用於sh環境下,如果在其他shell環境,例如csh,就會出現“Ambiguous output redirect.”這樣的錯誤。幸好crontab的預設shell正是sh.
7.產生記錄檔
與6的原理一樣,將其重新導向到檔案即可:
>/home/someuser/cronlogs/a.log 2>&1