歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

Linux 中的定時任務crontab

0x00前言

crontab命令常見於Unix和類Unix的操作系統之中,用於設置周期性被執行的指令。該命令從標准輸入設備讀取指令,並將其存放於“crontab”文件中,以供之後讀取和執行。該詞來源於希臘語 chronos(χρνο),原意是時間。常,crontab儲存的指令被守護進程激活, crond常常在後台運行,每一分鐘檢查是否有預定的作業需要執行。這類作業一般稱為cron jobs。0x01 crontab 定時任務

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

-u user:用來設定某個用戶的crontab服務;

file:file是命令文件的名字,表示將file做為crontab的任務列表文件並載入crontab。如果在命令行中沒有指定這個文件,crontab命令將接受標准輸入(鍵盤)上鍵入的命令,並將它們載入crontab。

-e:編輯某個用戶的crontab文件內容。如果不指定用戶,則表示編輯當前用戶的crontab文件。

-l:顯示某個用戶的crontab文件內容,如果不指定用戶,則表示顯示當前用戶的crontab文件內容。

-r:從/var/spool/cron目錄中刪除某個用戶的crontab文件,如不指定用戶,則默認刪除當前用戶的crontab文件。

-i:在刪除用戶的crontab文件時給確認提示。

分 時 日 月 星期 要運行的命令

第1列分鐘1~59

第2列小時1~23(0表示子夜)

第3列日1~31

第4列月1~12

第5列星期0~6(0表示星期天)

第6列要運行的命令

0x02 常用方法

創建一個新的crontab文件向cron進程提交一個crontab文件之前,首先要設置環境變量EDITOR。cron進程根據它來確定使用哪個編輯器編輯crontab文件。如果你使用vi,那麼你就編輯$HOME目掽下的. profile文件,在其中加入這樣一行:

EDITOR=vi; export EDITOR

然後保存並退出。不妨創建一個名為<user> cron的文件,其中<user>是用戶名,例如, davecron。在該文件中加入如下的內容。

# (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個域用空格分隔。

為了提交你剛剛創建的crontab文件,可以把這個新創建的文件作為cron命令的參數:

$ crontab davecron

列出crontab文件,使用-l參數列出crontab文件: #crontab -l

使用這種方法在$HOME目錄中對crontab文件做一備份#crontab -l > $HOME/mycron

編輯crontab文件 #crontab -e

刪除crontab文件#crontab -r

使用實例

每1分鐘執行一次myCommand * * * * * myCommand

每小時的第3和第15分鐘執行 3,15 * * * * myCommand

在上午8點到11點的第3和第15分鐘執行 3,15 8-11 * * * myCommand

每隔兩天的上午8點到11點的第3和第15分鐘執行 3,15 8-11 */2 * * myCommand

每周一上午8點到11點的第3和第15分鐘執行 3,15 8-11 * * 1 myCommand

每晚的21:30重啟smb 30 21 * * * /etc/init.d/smb restart

每月1、10、22日的4 : 45重啟smb 45 4 1,10,22 * * /etc/init.d/smb restart

每周六、周日的1 : 10重啟smb 10 1 * * 6,0 /etc/init.d/smb restart

晚上11點到早上7點之間,每隔一小時重啟smb * 23-7/1 * * * /etc/init.d/smb restart

使用注意事項

創建了一個crontab,但是這個任務卻無法自動執行,而手動執行這個任務卻沒有問題

由於在crontab文件中沒有配置環境變量引起

腳本中涉及文件路徑時寫全局路徑;

腳本執行要用到java或其他環境變量時,通過source命令引入環境變量

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 &

當手動執行腳本OK,但是crontab死活不執行時,很可能是環境變量惹的禍,可嘗試在crontab中直接引入環境變量解決問題。如:

0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

0x03 清理系統用戶的郵件日志

以在crontab文件中設置如下形式,忽略日志輸出:0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

系統級任務調度與用戶級任務調度

系統級任務調度主要完成系統的一些維護操作,用戶級任務調度主要完成用戶自定義的一些任務,可以將用戶級任務調度放到系統級任務調度來完成(不建議這麼做),但是反過來卻不行,root用戶的任務調度操作可以通過”crontab –uroot –e”來設置,也可以將調度任務直接寫入/etc/crontab文件,需要注意的是,如果要定義一個定時重啟系統的任務,就必須將任務放到/etc/crontab文件,即使在root用戶下創建一個定時重啟系統的任務也是無效的。

其他注意事項

新創建的cron job,不會馬上執行,至少要過2分鐘才執行。如果重啟cron則馬上執行。

當crontab失效時,可以嘗試以下語句,以便解決問題

/etc/init.d/crond restart

或者查看日志看某個job有沒有執行/報錯 tail -f /var/log/cron。

千萬別亂運行,它從Crontab目錄(/var/spool/cron)中刪除用戶的Crontab文件。刪除了該用戶的所有crontab

crontab -r

更新系統時間時區後需要重啟cron,在ubuntu中服務名為cron:

$service cron restart

date ‘+%Y%m%d’

date ‘+%Y%m%d’

歡迎大家分享更好的思路,熱切期待^^_^^ !

Copyright © Linux教程網 All Rights Reserved