通過crontab 命令,我們可以在固定的間隔時(shí)間執(zhí)行指定的系統(tǒng)指令或 shell script腳本。時(shí)間間隔的單位可以是分鐘、小時(shí)、日、月、周及以上的任意組合。這個(gè)命令非常適合周期性的日志分析或數(shù)據(jù)備份等工作。
crontab [-u user] [ -e | -l | -r ]
分 時(shí) 日 月 星期 要運(yùn)行的命令
向cron進(jìn)程提交一個(gè)crontab文件之前,首先要設(shè)置環(huán)境變量EDITOR。cron進(jìn)程根據(jù)它來確定使用哪個(gè)編輯器編輯crontab文件。9 9 %的UNIX和LINUX用戶都使用vi,如果你也是這樣,那么你就編輯$HOME目錄下的. profile文件,在其中加入這樣一行::
EDITOR=vi; export EDITOR
:
0,15,30,45 18-06 * /bin/echo 'date' > /dev/console
保存并退出。注意前面5個(gè)域用空格分隔。
在上面的例子中,系統(tǒng)將每隔1 5分鐘向控制臺(tái)輸出一次當(dāng)前時(shí)間。如果系統(tǒng)崩潰或掛起,從最后所顯示的時(shí)間就可以一眼看出系統(tǒng)是什么時(shí)間停止工作的。在有些系統(tǒng)中,用tty1來表示控制臺(tái),可以根據(jù)實(shí)際情況對(duì)上面的例子進(jìn)行相應(yīng)的修改。為了提交你剛剛創(chuàng)建的crontab文件,可以把這個(gè)新創(chuàng)建的文件作為cron命令的參數(shù)::
$ crontab davecron
現(xiàn)在該文件已經(jīng)提交給cron進(jìn)程,它將每隔1 5分鐘運(yùn)行一次。同時(shí),新創(chuàng)建文件的一個(gè)副本已經(jīng)被放在/var/spool/cron目錄中,文件名就是用戶名(即dave)。
使用-l參數(shù)列出crontab文件::
$ crontab -l
0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1
可以使用這種方法在$HOME目錄中對(duì)crontab文件做一備份::
$ crontab -l > $HOME/mycron
這樣,一旦不小心誤刪了crontab文件,可以用上一節(jié)所講述的方法迅速恢復(fù)。
如果希望添加、刪除或編輯crontab文件中的條目,而EDITOR環(huán)境變量又設(shè)置為vi,那么就可以用vi來編輯crontab文件::
$ crontab -e
可以像使用vi編輯其他任何文件那樣修改crontab文件并退出。如果修改了某些條目或添加了新的條目,那么在保存該文件時(shí), cron會(huì)對(duì)其進(jìn)行必要的完整性檢查。如果其中的某個(gè)域出現(xiàn)了超出允許范圍的值,它會(huì)提示你。 我們?cè)诰庉媍rontab文件時(shí),沒準(zhǔn)會(huì)加入新的條目。例如,加入下面的一條:
# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
30 3 1,7,14,21,26 * * /bin/find -name 'core' -exec rm {} \;
保存并退出。
最好在crontab文件的每一個(gè)條目之上加入一條注釋,這樣就可以知道它的功能、運(yùn)行時(shí)間,更為重要的是,知道這是哪位用戶的定時(shí)作業(yè)。
$crontab -r
* * * * * myCommand
3,15 * * * * myCommand
3,15 8-11 * * * myCommand
3,15 8-11 */2 * * myCommand
3,15 8-11 * * 1 myCommand
30 21 * * * /etc/init.d/smb restart
45 4 1,10,22 * * /etc/init.d/smb restart
10 1 * * 6,0 /etc/init.d/smb restart
0,30 18-23 * * * /etc/init.d/smb restart
0 23 * * 6 /etc/init.d/smb restart
* */1 * * * /etc/init.d/smb restart
* 23-7/1 * * * /etc/init.d/smb restart
有時(shí)我們創(chuàng)建了一個(gè)crontab,但是這個(gè)任務(wù)卻無法自動(dòng)執(zhí)行,而手動(dòng)執(zhí)行這個(gè)任務(wù)卻沒有問題,這種情況一般是由于在crontab文件中沒有配置環(huán)境變量引起的。
在crontab文件中定義多個(gè)調(diào)度任務(wù)時(shí),需要特別注環(huán)境變量的設(shè)置,因?yàn)槲覀兪謩?dòng)執(zhí)行某個(gè)任務(wù)時(shí),是在當(dāng)前shell環(huán)境下進(jìn)行的,程序當(dāng)然能找到環(huán)境變量,而系統(tǒng)自動(dòng)執(zhí)行任務(wù)調(diào)度時(shí),是不會(huì)加載任何環(huán)境變量的,因此,就需要在crontab文件中指定任務(wù)運(yùn)行所需的所有環(huán)境變量,這樣,系統(tǒng)執(zhí)行任務(wù)調(diào)度時(shí)就沒有問題了。
不要假定cron知道所需要的特殊環(huán)境,它其實(shí)并不知道。所以你要保證在shelll腳本中提供所有必要的路徑和環(huán)境變量,除了一些自動(dòng)設(shè)置的全局變量。所以注意如下3點(diǎn):
cat start_cbp.sh
!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)當(dāng)手動(dòng)執(zhí)行腳本OK,但是crontab死活不執(zhí)行時(shí),很可能是環(huán)境變量惹的禍,可嘗試在crontab中直接引入環(huán)境變量解決問題。如::
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
每條任務(wù)調(diào)度執(zhí)行完畢,系統(tǒng)都會(huì)將任務(wù)輸出信息通過電子郵件的形式發(fā)送給當(dāng)前系統(tǒng)用戶,這樣日積月累,日志信息會(huì)非常大,可能會(huì)影響系統(tǒng)的正常運(yùn)行,因此,將每條任務(wù)進(jìn)行重定向處理非常重要。 例如,可以在crontab文件中設(shè)置如下形式,忽略日志輸出::
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
"/dev/null 2>&1"表示先將標(biāo)準(zhǔn)輸出重定向到/dev/null,然后將標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出,由于標(biāo)準(zhǔn)輸出已經(jīng)重定向到了/dev/null,因此標(biāo)準(zhǔn)錯(cuò)誤也會(huì)重定向到/dev/null,這樣日志輸出問題就解決了。
系統(tǒng)級(jí)任務(wù)調(diào)度主要完成系統(tǒng)的一些維護(hù)操作,用戶級(jí)任務(wù)調(diào)度主要完成用戶自定義的一些任務(wù),可以將用戶級(jí)任務(wù)調(diào)度放到系統(tǒng)級(jí)任務(wù)調(diào)度來完成(不建議這么做),但是反過來卻不行,root用戶的任務(wù)調(diào)度操作可以通過"crontab –uroot –e"來設(shè)置,也可以將調(diào)度任務(wù)直接寫入/etc/crontab文件,需要注意的是,如果要定義一個(gè)定時(shí)重啟系統(tǒng)的任務(wù),就必須將任務(wù)放到/etc/crontab文件,即使在root用戶下創(chuàng)建一個(gè)定時(shí)重啟系統(tǒng)的任務(wù)也是無效的。
新創(chuàng)建的cron job,不會(huì)馬上執(zhí)行,至少要過2分鐘才執(zhí)行。如果重啟cron則馬上執(zhí)行。
當(dāng)crontab失效時(shí),可以嘗試/etc/init.d/crond restart解決問題?;蛘卟榭慈罩究茨硞€(gè)job有沒有執(zhí)行/報(bào)錯(cuò)tail -f /var/log/cron。
千萬別亂運(yùn)行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除用戶的Crontab文件。刪除了該用戶的所有crontab都沒了。
在crontab中%是有特殊含義的,表示換行的意思。如果要用的話必須進(jìn)行轉(zhuǎn)義\%,如經(jīng)常用的date ‘+%Y%m%d’在crontab里是不會(huì)執(zhí)行的,應(yīng)該換成date ‘+\%Y\%m\%d’。
更新系統(tǒng)時(shí)間時(shí)區(qū)后需要重啟cron,在ubuntu中服務(wù)名為cron::
$service cron restart
ubuntu下啟動(dòng)、停止與重啟cron::
$sudo /etc/init.d/cron start
$sudo /etc/init.d/cron stop
$sudo /etc/init.d/cron restart