Crontab 簡介使用與常見問題解決

 

     Linux 系統則是由 cron (crond) 這個系統服務來控制的。Linux 系統上面本來就有很是多的計劃性工做,所以這個系統服務是默認啓動的。另外, 因爲使用者本身也能夠設置計劃任務,因此, Linux 系統也提供了使用者控制計劃任務的命令 :crontab 命令。java


1、crond簡介


       Crontab服務是Unix/Linux下的工業級服務,使用它能夠設置週期性的任務執行,不須要常駐程序,這對程序的要求高度以及系統的性能開銷起到積極做用。Crontab是Unix/
Linux下主要的調度進程,不需人工干擾下做業,而且其能夠容許用戶提交、編輯及刪除對應的任務做業,另外,每一個用戶都擁有一個Crontab文件保存調度信息,管理員能夠經過編輯cron.deny及c
ron.allow兩個文件禁止或許可用戶擁有Contab。
         在 Linux/unix 下的 crontab 會自動的幫咱們每分鐘從新讀取一次 /etc/crontab 的例行工做事項,可是某些緣由或者是其餘的Unix/linux系統中,因爲crontab 是讀到內存當中的,因此在你修改完 /etc/crontab 以後,可能並不會立刻運行, 這個時候請從新啓動 crond 這個服務:/etc/init.d/crond restart。
         crond 是linux下用來週期性的執行某種任務或等待處理某些事件的一個守護進程,與windows下的計劃任務相似,當安裝完成操做系統後,默認會安裝此服務 工具,而且會自動啓動crond進程,crond進程每分鐘會按期檢查是否有要執行的任務,若是有要執行的任務,則自動執行該任務。
        Linux下的任務調度分爲兩類,系統任務調度和用戶任務調度。系統任務調度:系統週期性所要執行的工做,好比寫緩存數據到硬盤、日誌清理等。在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。linux

 

2、crond服務

# 安裝crontab:

yum install crontabs
# 服務操做說明:

/sbin/service crond start //啓動服務

/sbin/service crond stop //關閉服務

/sbin/service crond restart //重啓服務

/sbin/service crond reload //從新載入配置

/sbin/service crond status //啓動服務


        查看crontab服務是否已設置爲開機啓動,執行命令:sql

ntsysv

        

 

    加入開機自動啓動:shell

chkconfig –level 35 crond on

 

3、crontab命令詳解

 

        1.命令格式:apache

crontab [-u user] file

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

        2.命令功能:vim

        經過crontab 命令,咱們能夠在固定的間隔時間執行指定的系統指令或 shell script腳本。時間間隔的單位能夠是分鐘、小時、日、月、周及以上的任意組合。這個命令很是設合週期性的日誌分析或數據備份等工做。windows

        3.命令參數:緩存

-u user:用來設定某個用戶的crontab服務,例如,「-u ixdba」表示設定ixdba用戶的crontab服務,
此參數通常有root用戶來運行。

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

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

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

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

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

        4.經常使用方法:bash

        1). 建立一個新的crontab文件oracle

        在 考慮向cron進程提交一個crontab文件以前,首先要作的一件事情就是設置環境變量EDITOR。cron進程根據它來肯定使用哪一個編輯器編輯 crontab文件。9 9 %的UNIX和LINUX用戶都使用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個域用空格分隔。

        在 上面的例子中,系統將每隔1 5分鐘向控制檯輸出一次當前時間。若是系統崩潰或掛起,從最後所顯示的時間就能夠一眼看出系統是什麼時間中止工做的。在有些 系統中,用tty1來表示控制檯,能夠根據實際狀況對上面的例子進行相應的修改。爲了提交你剛剛建立的crontab文件,能夠把這個新建立的文件做爲 cron命令的參數:

$ crontab davecron

        如今該文件已經提交給cron進程,它將每隔1 5分鐘運行一次。同時,新建立文件的一個副本已經被放在/var/spool/cron目錄中,文件名就是用戶名(即dave)。

        2). 列出crontab文件

        爲了列出crontab文件,能夠用:

$ crontab -l

0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1

你將會看到和上面相似的內容。可使用這種方法在$HOME目錄中對crontab文件作一備份:

$ crontab -l > $HOME/mycron

這樣,一旦不當心誤刪了crontab文件,能夠用上述的方法迅速恢復。

        3). 編輯crontab文件

        若是但願添加、刪除或編輯crontab文件中的條目,而EDITOR環境變量又設置爲v i,那麼就能夠用v i來編輯crontab文件,相應的命令爲:

$ crontab -e

        能夠像使用v i編輯其餘任何文件那樣修改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 -l命令列出它的所有信息:

$ crontab -l

# (crondave installed on Tue May 4 13:07:43 1999)

# DT:ech the date to the console every 30 minites

0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1

# 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 {} \;

        4). 刪除crontab文件

# 要刪除crontab文件,能夠用:

$ crontab -r

        5). 恢復丟失的crontab文件

若是不當心誤刪了crontab文件,假設你在本身的$HOME目錄下還有一個備份,
那麼能夠將其拷貝到/var/spool/cron/<username>,其中<username>是用戶名。
若是因爲權限問題沒法完成拷貝,能夠用:

$ crontab <filename>

其中,<filename>是你在$HOME目錄中副本的文件名。

我建議你在本身的$ H O M E目錄中保存一個該文件的副本。我就有過相似的經歷,
有數次誤刪了crontab文件(由於r鍵緊挨在e鍵的右邊)。這就是爲何有些系統文檔建議不要直接編輯crontab文件,
而是編輯該文件的一個副本,而後從新提交新的文件。

有些crontab的變體有些怪異,因此在使用crontab命令時要格外當心。若是遺漏了任何選項,
crontab可能會打開一個空文件,或者看起來像是個空文件。這時敲delete鍵退出,不要按<Ctrl-D>,
不然你將丟失crontab文件。

5.使用實例

實例1:每1分鐘執行一次command
命令:
* * * * * command
實例2:每小時的第3和第15分鐘執行
命令:
3,15 * * * * command
實例3:在上午8點到11點的第3和第15分鐘執行
命令:
3,15 8-11 * * * command
實例4:每隔兩天的上午8點到11點的第3和第15分鐘執行
命令:
3,15 8-11 */2 * * command
實例5:每一個星期一的上午8點到11點的第3和第15分鐘執行
命令:
3,15 8-11 * * 1 command
實例6:每晚的21:30重啓smb 
命令:
30 21 * * * /etc/init.d/smb restart
實例7:每個月一、十、22日的4 : 45重啓smb 
命令:
45 4 1,10,22 * * /etc/init.d/smb restart
實例8:每週6、週日的1 : 10重啓smb
命令:
10 1 * * 6,0 /etc/init.d/smb restart
實例9:天天18 : 00至23 : 00之間每隔30分鐘重啓smb 
命令:
0,30 18-23 * * * /etc/init.d/smb restart
實例10:每星期六的晚上11 : 00 pm重啓smb 
命令:
0 23 * * 6 /etc/init.d/smb restart
實例11:每一小時重啓smb 
命令:
* */1 * * * /etc/init.d/smb restart
實例12:晚上11點到早上7點之間,每隔一小時重啓smb 
命令:
* 23-7/1 * * * /etc/init.d/smb restart
實例13:每個月的4號與每週一到週三的11點重啓smb 
命令:
0 11 4 * mon-wed /etc/init.d/smb restart
實例14:一月一號的4點重啓smb 
命令:
0 4 1 jan * /etc/init.d/smb restart
實例15:每小時執行/etc/cron.hourly目錄內的腳本
命令:
01 * * * * root run-parts /etc/cron.hourly


說明:
run-parts這個參數了,若是去掉這個參數的話,後面就能夠寫要運行的某個腳本名,而不是目錄名了

sh腳本文件:test.sh

#! /bin/sh

su - oracle << EOF

sqlplus test/test@test @"test.sql"

sql腳本文件:test.sql

insert into test_tb values (sysdate);

crontab文件:

0,15,30,45 * * * * /apps/bin/test.sh
附crontab規則詳細實例

一、天天6:00執行

0 6 * * * root /home/mvp/osyunwei.sh

二、每週六凌晨4:00執行

0 4 * * 6 root /home/mvp/osyunwei.sh

三、每週六凌晨4:05執行

5 4 * * 6 root /home/mvp/osyunwei.sh 

四、每週六凌晨4:15執行

15 4 * * 6 root /home/mvp/osyunwei.sh

五、每週六凌晨4:25執行

25 4 * * 6 root /home/mvp/osyunwei.sh

六、每週六凌晨4:35執行

35 4 * * 6 root /home/mvp/osyunwei.sh

七、每週六凌晨5:00執行

5 * * 6 root /home/mvp/osyunwei.sh

八、天天8:40執行

40 8 * * * root /home/mvp/osyunwei.sh

九、天天8:30執行

30 8 * * * root /home/mvp/osyunwei.sh

十、每週一到週五的11:41開始,每隔10分鐘執行一次    #值得借鑑

41,51 11 * * 1-5   root /home/mvp/osyunwei.sh

或者

1-59/10 12-23 * * 1-5   root /home/mvp/osyunwei.sh

十一、在天天的10:31開始,每隔2小時重複一次

31 10-23/2 * * * root   /home/mvp/osyunwei.sh

十二、天天15:00執行

0 15 * * *  root /home/mvp/osyunwei.sh

1三、天天的10:30開始,每隔2小時重複一次

30 10-23/2 * * * root  /home/mvp/osyunwei.sh

1四、天天15:30執行

30 15 * * *  root /home/mvp/osyunwei.sh

1五、天天17:50執行

50 17 * * *  root /home/mvp/osyunwei.sh

1六、天天8:00執行

0 8 * * *  root  /home/mvp/osyunwei.sh

1七、天天18:00執行

0 18 * * *  root  /home/mvp/osyunwei.sh

1八、天天8:30執行

30 8 * * *  root  /home/mvp/osyunwei.sh

1九、天天20:30

30 20 * * *  root /home/mvp/osyunwei.sh

20、每週一到週五2:00

0 2 * * 1-5 root /home/mvp/osyunwei.sh

2一、每週一到週五9:30

30 9 * * 1-5 root /home/mvp/osyunwei.sh

2二、每週一到週五8:00,每週一到週五9:00

0 8,9 * * 1-5  root /home/mvp/osyunwei.sh

2三、天天23:59

59 23 * * *  root  /home/mvp/osyunwei.sh

2四、每週六23:59

59 23 * * 6  root    /home/mvp/osyunwei.sh

2五、天天0:30

30 0 * * *  root  /home/mvp/osyunwei.sh

2六、每週一到週五9:25到11:35之間、13:00到15:00之間,每隔10分鐘運行一次

分區段寫值得借鑑

25,35,45,55  9 * * 1-5  root   /home/mvp/osyunwei.sh

5-59/10  10 * * 1-5  root   /home/mvp/osyunwei.sh

5,15,25,35  11 * * 1-5  root   /home/mvp/osyunwei.sh

*/10  13-15 * * 1-5  root   /home/mvp/osyunwei.sh

2七、每週一到週五8:30、8:50、9:30、10:00、10:30、11:00、11:30、13:30、14:00、14:30、5:00分別執行一次

30,50 8 * * 1-5  root  /home/mvp/osyunwei.sh

30 9 * * 1-5  root  /home/mvp/osyunwei.sh

*/30 10-11 * * 1-5  root  /home/mvp/osyunwei.sh

30 13 * * 1-5  root  /home/mvp/osyunwei.sh

0,30 14-15 * * 1-5  root  /home/mvp/osyunwei.sh

2八、天天23:50執行

50 23 * * *  root  /home/mvp/osyunwei.sh

2九、天天10:00、16:00執行

0 10,16 * * *  root /home/mvp/osyunwei.sh

30、天天5:30執行

30 5 * * *  root  /home/mvp/osyunwei.sh

3一、每週一到週五9:30執行

30 9 * * 1-5  root  /home/mvp/osyunwei.sh

3二、每週一到週五13:00執行

0 13 * * 1-5  root  /home/mvp/osyunwei.sh

3三、天天7:51執行

51 7 * * *  root /home/mvp/osyunwei.sh

3四、天天7:5三、12:40分別執行一次

53 7 * * *  root /home/mvp/osyunwei.sh

40 12 * * *  root /home/mvp/osyunwei.sh

3五、天天7:55執行

55 7 * * *  root  /home/mvp/osyunwei.sh

3六、天天8:十、16:00、20:00分別執行一次

10 8 * * *  root  /home/mvp/osyunwei.sh

0 16 * * *  root  /home/mvp/osyunwei.sh

0 20 * * *  root  /home/mvp/osyunwei.sh

3七、天天7:5七、8:00分別執行一次

57 7 * * *  root  /home/mvp/osyunwei.sh

0 8 * * *  root  /home/mvp/osyunwei.sh


4、使用注意事項

 

        1. 注意環境變量問題
        有時咱們建立了一個crontab,可是這個任務卻沒法自動執行,而手動執行這個任務卻沒有問題,這種狀況通常是因爲在crontab文件中沒有配置環境變量引發的。

        在 crontab文件中定義多個調度任務時,須要特別注意的一個問題就是環境變量的設置,由於咱們手動執行某個任務時,是在當前shell環境下進行的,程 序固然能找到環境變量,而系統自動執行任務調度時,是不會加載任何環境變量的,所以,就須要在crontab文件中指定任務運行所需的全部環境變量,這 樣,系統執行任務調度時就沒有問題了。

        不要假定cron知道所須要的特殊環境,它其實並不知道。因此你要保證在shelll腳本中提供全部必要的路徑和環境變量,除了一些自動設置的全局變量。因此注意以下3點:

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

        2)腳本執行要用到java或其餘環境變量時,經過source命令引入環境變量,如:

cat start_jboss.sh

#!/bin/sh

source /etc/profile

export RUN_CONF=/home/redhat/conf/platform/cbp/cbp_jboss.conf

/usr/local/jboss-7.0.5/bin/run.sh -c mev &

        3)當手動執行腳本OK,可是crontab死活不執行時。這時必須大膽懷疑是環境變量惹的禍,並能夠嘗試在crontab中直接引入環境變量解決問題。如:

0 * * * * . /etc/profile;/bin/sh /var/www/java/test/bin/restart_audit_test.sh

        注意清理系統用戶的日誌.每條任務調度執行完畢,這樣日積月累,日誌信息會很是大,可能會影響系統的正常運行,所以,將每條任務進行重定向處理很是重要。

        例如,能夠在crontab文件中設置以下形式,忽略日誌輸出:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

        「/dev/null 2>&1」表示先將標準輸出重定向到/dev/null,而後將標準錯誤重定向到標準輸出,因爲標準輸出已經重定向到了/dev/null,所以標準錯誤也會重定向到/dev/null,這樣日誌輸出問題就解決了。

        2. 系統級任務調度與用戶級任務調度
        系統級任務調度主要完成系統的一些維護操做,用戶級任務調度主要完成用戶自定義的一些任務,能夠將用戶級任務調度放到系統級任務調度來完成(不建議這麼作),可是反過來卻不行,root用戶的任務調度操做能夠經過「crontab –uroot –e」來設置,也能夠將調度任務直接寫入/etc /crontab文件,須要注意的是,若是要定義一個定時重啓系統的任務,就必須將任務放到/etc/crontab文件,即便在root用戶下建立一個 定時重啓系統的任務也是無效的。

        3. 其餘注意事項
        新建立的cron job,不會立刻執行,至少要過2分鐘才執行。若是重啓cron則立刻執行。當crontab忽然失效時,能夠嘗試/etc/init.d/crond restart解決問題。或者查看日誌看某個job有沒有執行/報錯tail -f /var/log/cron。

千萬別亂運行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除用戶的Crontab文件。
刪除了該用戶的全部crontab都沒了。

        在crontab中%是有特殊含義的,表示換行的意思。若是要用的話必須進行轉義\%,如常常用的date ‘+%Y%m%d’在crontab裏是不會執行的,應該換成date ‘+\%Y\%m\%d’。

crontab -l  列出當前登陸用戶全部定時任務
crontab -l -u XXX  列出XXX用戶的全部定時任務,若有沒有會提示 no crontab for XXX
crontab -e  編輯當前用戶的定時任務
crontab -r  刪除當前用戶的定時任務
 
查看crontab的執行狀況:  tail -f /var/log/cron
查看crontab的執行log:vim /var/spool/mail/root
每日生成一個以時間命名的log文件
#!/bin/bash
echo "Spring Cloud - 收付 - 清空日誌"
var=`date +%Y-%m-%d`
cd /home/redhat/SpringBoot/
zip -r nohup.out.$var.zip nohup.out
cp /dev/null nohup.out 


        4. 定時任務的時間設置

* * * * *               每分鐘執行
*/1 * * * *           每分鐘執行
0 5 * * *                天天五點執行
0-59/2 * * * *        每隔兩分鐘執行,且是偶數分鐘執行,好比2,4,6
1-58/2 * * * *        每隔兩分鐘執行,且是奇數分鐘執行,好比3,5,7
0 0 1,5,10 * *        每月1號,5號,10號執行
0 0 1-5 * *            每月 1到5號執行

minute: 表示分鐘,能夠是從0到59之間的任何整數。

hour:表示小時,能夠是從0到23之間的任何整數。

day:表示日期,能夠是從1到31之間的任何整數。

month:表示月份,能夠是從1到12之間的任何整數。

week:表示星期幾,能夠是從0到7之間的任何整數,這裏的0或7表明星期日。

command:要執行的命令,能夠是系統命令,也能夠是本身編寫的腳本文件。

 

5、CRONTAB語法及應用

 

        1. 查看當前用戶的定時任務

[oracle@localhost ~]$ crontab -l

* * * * * /home/oracle/test.sh >/dev/null 2>&1

        2. 編輯當前用戶的定時任務

能夠在編輯狀態修改、刪除、新增一些定時任務。註釋通常用#

[oracle@localhost ~]$ crontab -e

        3. 刪除當前用戶的定時任務

[root@localhost ~]# crontab -r

[root@localhost ~]# crontab -l

no crontab for root

        4. 以下所示,通常crontab文件裏面的定時任務格式以下所示:

59 23 * * * /home/oracle/scripts/alert_log_archive.sh >/dev/null 2>&1

crontab 文件中每一個條目中各個域的意義和格式:

第一列 分鐘: 1——59

第二列 小時: 1——23(0表示子夜)

第三列 日 : 1——31

第四列 月 : 1——12

第五列 星期: 星期0——6(0表示星期天,1表示星期1、以此類推)

第六列 要運行的命令

 

        6. 能夠在線查看crontab手冊

$man crontab | more

        

7、crontab不執行的緣由和解決方案


        首先得肯定,腳本寫的是否正確,shell腳本是否擁有執行權限。一切正常還不能執行的話,就用如下方法:

# 使root用戶的crontab生效
crontab -u root /var/spool/cron/root

# 重啓crontab服務
service crond restart

 

        錯誤示例一:

"cronfile1":2: premature EOF
errors in crontab file, can"t install.
在crontab文件末尾增長一個空行就可解決此問題。

        錯誤示例二:

"/tmp/crontab.NINM91":2: bad day-of-week
errors in crontab file,can"t install

根據提示,是第二行的 周寫錯了

crontab -e保存時,crond會檢測時間格式,若是時間格式不正確就會報錯errors in crontab file,can’t install,仍是一個很人性化的設置。
相關文章
相關標籤/搜索