鍍金池/ 教程/ Linux/ crontab 定時(shí)任務(wù)
進(jìn)程管理工具
objdump 二進(jìn)制文件分析
scp 跨機(jī)遠(yuǎn)程拷貝
crontab 定時(shí)任務(wù)
readelf elf文件格式分析
pstack 跟蹤進(jìn)程棧
系統(tǒng)管理及IPC資源管理
vmstat 監(jiān)視內(nèi)存使用情況
strace 跟蹤進(jìn)程中的系統(tǒng)調(diào)用
sar 找出系統(tǒng)瓶頸的利器
ipcs 查詢進(jìn)程間通信狀態(tài)
ps 進(jìn)程查看器
性能優(yōu)化
wget 文件下載
top linux下的任務(wù)管理器
磁盤管理
size 查看程序內(nèi)存映像大小
free 查詢可用內(nèi)存
文件及目錄管理
iostat 監(jiān)視I/O子系統(tǒng)
性能監(jiān)控
程序構(gòu)建
學(xué)會(huì)使用命令幫助
gdb 調(diào)試?yán)?/span>
網(wǎng)絡(luò)工具
nm 目標(biāo)文件格式分析
lsof 一切皆文件
用戶管理工具
程序調(diào)試
ldd 查看程序依賴庫(kù)
文本處理

crontab 定時(shí)任務(wù)

通過crontab 命令,我們可以在固定的間隔時(shí)間執(zhí)行指定的系統(tǒng)指令或 shell script腳本。時(shí)間間隔的單位可以是分鐘、小時(shí)、日、月、周及以上的任意組合。這個(gè)命令非常適合周期性的日志分析或數(shù)據(jù)備份等工作。

命令格式

crontab [-u user] [ -e | -l | -r ]

命令參數(shù)

  • -u user:用來設(shè)定某個(gè)用戶的crontab服務(wù);
  • file:file是命令文件的名字,表示將file做為crontab的任務(wù)列表文件并載入crontab。如果在命令行中沒有指定這個(gè)文件,crontab命令將接受標(biāo)準(zhǔn)輸入(鍵盤)上鍵入的命令,并將它們載入crontab。
  • -e:編輯某個(gè)用戶的crontab文件內(nèi)容。如果不指定用戶,則表示編輯當(dāng)前用戶的crontab文件。
  • -l:顯示某個(gè)用戶的crontab文件內(nèi)容,如果不指定用戶,則表示顯示當(dāng)前用戶的crontab文件內(nèi)容。
  • -r:從/var/spool/cron目錄中刪除某個(gè)用戶的crontab文件,如果不指定用戶,則默認(rèn)刪除當(dāng)前用戶的crontab文件。
  • -i:在刪除用戶的crontab文件時(shí)給確認(rèn)提示。

crontab的文件格式

分 時(shí) 日 月 星期 要運(yùn)行的命令

  • 第1列分鐘1~59
  • 第2列小時(shí)1~23(0表示子夜)
  • 第3列日1~31
  • 第4列月1~12
  • 第5列星期0~6(0表示星期天)
  • 第6列要運(yùn)行的命令

常用方法

創(chuàng)建一個(gè)新的crontab文件

向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
然后保存并退出。不妨創(chuàng)建一個(gè)名為 cron的文件,其中是用戶名,例如, davecron。在該文件中加入如下的內(nèi)容。

:

(put your own initials here)echo the date to the console every

15minutes between 6pm and 6am

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)。

列出crontab文件

使用-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文件

如果希望添加、刪除或編輯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文件

$crontab -r

使用實(shí)例

實(shí)例1:每1分鐘執(zhí)行一次myCommand

* * * * * myCommand

實(shí)例2:每小時(shí)的第3和第15分鐘執(zhí)行

3,15 * * * * myCommand

實(shí)例3:在上午8點(diǎn)到11點(diǎn)的第3和第15分鐘執(zhí)行

3,15 8-11 * * * myCommand

實(shí)例4:每隔兩天的上午8點(diǎn)到11點(diǎn)的第3和第15分鐘執(zhí)行

3,15 8-11 */2  *  * myCommand

實(shí)例5:每周一上午8點(diǎn)到11點(diǎn)的第3和第15分鐘執(zhí)行

3,15 8-11 * * 1 myCommand

實(shí)例6:每晚的21:30重啟smb

30 21 * * * /etc/init.d/smb restart

實(shí)例7:每月1、10、22日的4 : 45重啟smb

45 4 1,10,22 * * /etc/init.d/smb restart

實(shí)例8:每周六、周日的1 : 10重啟smb

10 1 * * 6,0 /etc/init.d/smb restart

實(shí)例9:每天18 : 00至23 : 00之間每隔30分鐘重啟smb

0,30 18-23 * * * /etc/init.d/smb restart

實(shí)例10:每星期六的晚上11 : 00 pm重啟smb

0 23 * * 6 /etc/init.d/smb restart

實(shí)例11:每一小時(shí)重啟smb

* */1 * * * /etc/init.d/smb restart

實(shí)例12:晚上11點(diǎn)到早上7點(diǎn)之間,每隔一小時(shí)重啟smb

* 23-7/1 * * * /etc/init.d/smb restart

使用注意事項(xiàng)

注意環(huán)境變量問題

有時(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):

  1. 腳本中涉及文件路徑時(shí)寫全局路徑;
  2. 腳本執(zhí)行要用到j(luò)ava或其他環(huán)境變量時(shí),通過source命令引入環(huá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

注意清理系統(tǒng)用戶的郵件日志

每條任務(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)度與用戶級(jí)任務(wù)調(diào)度

系統(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ù)也是無效的。

其他注意事項(xiàng)

新創(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