Linux之crontab命令
簡介
通過crontab 命令,我們可以在固定的間隔時間執行指定的系統指令或 shell 指令碼。時間間隔的單位可以
是分鐘、小時、日、月、周及以上的任意組合。這個命令非常適合週期性的日誌分析或資料備份等工作。
systemctl start/stop/restart/status cron
命令格式
crontab [-u user] filecrontab [-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檔案時給確認提示。
crontab檔案格式
欄位 | 描述 | 允許的值 |
---|---|---|
分鐘 | 一小時的第幾分 | 0-59 |
小時 | 一天的第幾小時 | 0-23 |
日期 | 一個月的的第幾天 | 1-31 |
月份 | 一年的第幾個月 | 1-12 |
周幾 | 一週的第幾天 | 0-6 |
命令 | 命令 | 可以被執行的任何命令 |
實際運用
建立一個新的 crontab 檔案,向cron程序提交一個crontab檔案之前,首先要設定環境變數EDITOR。
cron程序根據它來確定使用哪個編輯器編輯crontab檔案。99%的UNIX和LINUX使用者都使用vi,如果你
也是這樣,那麼就編輯$HOME目錄下的. profile檔案,在其中加入這樣一行
EDITOR=vi; export EDITOR
然後儲存並退出。建立一個名為cron的檔案,其中加上使用者名稱,例如, testcron。在該檔案中加入
如下的內容,儲存並退出。注意前面5個域用空格分隔。
# (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
在上面的例子中,系統將每隔1 5分鐘向控制檯輸出一次當前時間。如果系統崩潰或掛起,從最後
所顯示的時間就可以一眼看出系統是什麼時間停止工作的。在有些系統中,用tty1來表示控制檯,可以
根據實際情況對上面的例子進行相應的修改。為了提交你剛剛建立的crontab檔案,可以把這個新建立
的檔案作為cron命令的引數$ crontab davecron。
現在該檔案已經提交給cron程序,它將每隔15分鐘執行一次。同時,新建立檔案的一個副本已經
被放在/var/spool/cron目錄中,檔名就是使用者名稱(即test)。
使用 -l 引數可以列出crontab檔案
[test@localhost ~]$ crontab -l 0,15,30,45 18-06 * * * /bin/echo `date` > dev/tty1
同時,可以使用這種方法在$HOME目錄中對crontab檔案做一備份。一旦不小心誤刪了crontab文
件,可以用特定的方法迅速恢復。
[test@localhost ~]$ $ crontab -l > $HOME/mycron
如果希望新增、刪除或編輯crontab檔案中的條目,而EDITOR環境變數又設定為vi,那麼輸入
crontab -e就可以用vi來編輯crontab檔案。
使用vi編輯其他任何檔案那樣修改crontab檔案並退出。如果修改了某些條目或添加了新的條目,
那麼在儲存該檔案時, cron會對其進行必要的完整性檢查。如果其中的某個域出現了超出允許範圍
的值,它會提示你。我們在編輯crontab檔案時,沒準會加入新的條目。例如,加入下面的一條:
# 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檔案的每一個條目之上加入一條註釋,這樣就可以知道它的功能、執行時間,更
為重要的是,知道這是哪位使用者的定時作業。要刪除crontab檔案使用命令crontab -r。
常用方法
每1分鐘執行一次cmd
* * * * * cmd
每小時的第3和第15分鐘執行
3,15 * * * * cmd
在上午8點到11點的第3和第15分鐘執行
3,15 8-11 * * * cmd
每隔兩天的上午8點到11點的第3和第15分鐘執行
3,15 8-11 */2 * * cmd
每週一上午8點到11點的第3和第15分鐘執行
3,15 8-11 * * 1 cmd
每晚的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
每天18 : 00至23 : 00之間每隔30分鐘重啟smb
0,30 18-23 * * * /etc/init.d/smb restart
每星期六的晚上11 : 00 pm重啟smb
0 23 * * 6 /etc/init.d/smb restart
每一小時重啟smb
0 */1 * * * /etc/init.d/smb restart
晚上11點到早上7點之間,每隔一小時重啟smb
0 23-7 * * * /etc/init.d/smb restart
使用中需注意的事項
注意環境變數問題
有時我們建立了一個crontab,但是這個任務卻無法自動執行,而手動執行這個任務卻沒有問
題,這種情況一般是由於在crontab檔案中沒有配置環境變數引起的。
在crontab檔案中定義多個排程任務時,需要特別注環境變數的設定,因為我們手動執行某個
任務時,是在當前shell環境下進行的,程式當然能找到環境變數,而系統自動執行任務排程時,
是不會載入任何環境變數的,因此,就需要在crontab檔案中指定任務執行所需的所有環境變數,
這樣,系統執行任務排程時就沒有問題了。
不要假定cron知道所需要的特殊環境,它其實並不知道。所以你要保證在shelll指令碼中提供所
有必要的路徑和環境變數,除了一些自動設定的全域性變數。所以注意如下3點:
- 指令碼中涉及檔案路徑時寫全域性路徑;
- 指令碼執行要用到java或其他環境變數時,通過source命令引入環境變數,例如:
cat start_cbp.sh #!/bin/sh source /etc/profile export RUN_CONF=/home/rumenz /usr/local/temp/bin/run.sh -c mev &
- 當手動執行指令碼OK,但是crontab死活不執行時,很可能是環境變數惹的禍,可嘗試在crontab中直接引入環境變數解決問題。
0 * * * * /etc/profile;/bin/sh /var/www/java/bin/restart_audit.sh
注意清理系統使用者的郵件日誌
每條任務排程執行完畢,系統都會將任務輸出資訊通過電子郵件的形式傳送給當前系統使用者,
這樣日積月累,日誌資訊會非常大,可能會影響系統的正常執行,因此,將每條任務進行重定向處
理非常重要。例如,可以在crontab檔案中設定如下形式,忽略日誌輸出:
0 */3 * * * /usr/local/bin/apachectl restart >/dev/null 2>&1
/dev/null 2>&1
表示先將標準輸出重定向到/dev/null
,然後將標準錯誤重定向到標準輸出,
由於標準輸出已經重定向到了/dev/null
,因此標準錯誤也會重定向到/dev/null
,這樣日誌輸出
問題就解決了。
系統級任務排程與使用者級任務排程
系統級任務排程主要完成系統的一些維護操作,使用者級任務排程主要完成使用者自定義的一些
任務,可以將使用者級任務排程放到系統級任務排程來完成(不建議這麼做),但是反過來卻不行,
root使用者的任務排程操作可以通過crontab –uroot –e
來設定,也可以將排程任務直接寫入
/etc/crontab
檔案,需要注意的是,如果要定義一個定時重啟系統的任務,就必須將任務放到
/etc/crontab
檔案,即使在root使用者下建立一個定時重啟系統的任務也是無效的。
作者:Sweettesting —— 半醉半醒半浮生
出處:http://www.cnblogs.com/Sweettesting/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。