天天看點

cron定時任務詳解

crond是什麼?

crond 和crontab是不可分割的。crontab是一個指令,常見于Unix和類Unix的作業系統之中,用于設定周期性被執行的指令。該指令從标準輸入裝置讀取指令,并将其存放于“crontab”檔案中,以供之後讀取和執行。該詞來源于希臘語chronos(χρόνος),原意是時間。

而crond正是它的守護程序。cron服務是一個定時執行的服務,可以通過crontab 指令添加或者編輯需要定時執行的任務。

linux定時任務分為兩種

1)系統自身輪訓的任務,比如定時(5天或者一周)備份/var/log/message等日志檔案(系統的定時任務一般分為七段或者八段(centos6以下),以空格分割)

系統輪訓的配置檔案/etc/logrotate.conf  (centos7以下的在/etc/cron.daily/logrotate/logrotate.conf )

cron定時任務詳解
cron定時任務詳解

2)使用者執行的定時任務(使用者的定時任務一般分為六段)

at适合執行一次就結束的排程任務

anacrontab适合于非7*24小時開機的伺服器準備的,是以天為機關執行的,不能指定以分鐘的定時任務,在停機期間沒有任務執行,可以開機時執行。

cron服務是Linux的内置服務,但它不會開機自動啟動,可以每分鐘執行任務。可以用以下指令啟動和停止服務:

/bin/systemctl start crond

/bin/systemctl stop crond

/bin/systemctl restart crond

/bin/systemctl reload crond

/bin/systemctl status crond

以上1-5行分别為啟動、停止、重新開機服務和重新加載配置、檢視服務狀态

把cron設為在開機的時候自動啟動

vi /etc/rc.local

/bin/systemctl start crond.service

crontab操作

crontab -u //設定某個使用者的cron服務

crontab -l //列出某個使用者cron服務的詳細内容

crontab -r //删除某個使用者的cron服務

crontab -e //編輯某個使用者的cron服務

crontab -i //列印提示,輸入yes等确認資訊

/var/spool/cron/root (以使用者命名的檔案) 是所有預設存放定時任務的檔案

/etc/cron.deny 該檔案中所列出使用者不允許使用crontab指令

/etc/cron.allow 該檔案中所列出使用者允許使用crontab指令,且優先級高于/etc/cron.deny

/var/log/cron    該檔案存放cron服務的日志

基本格式

# For details see man 4 crontabs

# Example of job definition:

# .---------------- minute (0 - 59)

# | .------------- hour (0 - 23)

# | | .---------- day of month (1 - 31)

# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...

# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

# | | | | |

# * * * * * user-name command to be executed

定時任務的每段為:分,時,日,月,周,使用者,指令

第1清單示分鐘1~59 每分鐘用*或者 */1表示

第2清單示小時1~23(0表示0點)

第3清單示日期1~31

第4清單示月份1~12

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

第6列要運作的指令

*:表示任意時間都,實際上就是“每”的意思。可以代表00-23小時或者00-12每月或者00-59分

-:表示區間,是一個範圍,00 17-19 * * * cmd,就是每天17,18,19點的整點執行指令

,:是分割時段,30 3,19,21 * * * cmd,就是每天淩晨3和晚上19,21點的半點時刻執行指令

/n:表示分割,可以看成除法,*/5 * * * * cmd,每隔五分鐘執行一次

cron定時任務詳解

基本使用

crontab -l -u root       #檢視root使用者

0 */1 * * * command

0 */2 * * * command

crontab -e                  #編輯定時任務,在編寫時會檢查文法,而echo,或者vi編輯配置時不會檢查(visudo也會檢查文法)

0 */1 * * * command

0 */2 * * * command

crontab檔案的一些例子:

1)30 21 * * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每晚的21:30重新開機apache。

2)45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每月1、10、22日的4 : 45重新開機apache。

3)10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每周六、周日的1 : 10重新開機apache。

4)0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示在每天18 : 00至23 : 00之間每隔30分鐘重新開機apache。最後一次的任務執行時間為23:30

5)0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每星期六的11 : 00 pm重新開機apache。

6)* */1 * * * /usr/local/etc/rc.d/lighttpd restart

每一小時重新開機apache(錯誤的)

*代表每分鐘就執行一次,上面的語句的意思為每隔一小時的每分鐘都在執行重新開機apache

*/60 * * * * #每60分鐘即每小時執行一次

*/105 * * * * #每105分鐘執行一次

7)* 23,00-7/1 * * * /usr/local/etc/rc.d/lighttpd restart

晚上11點到早上7點之間,每隔一小時重新開機apache(錯誤的)

上面的定時任務的分鐘為*号,代表每分鐘都在執行,表示晚上23點和淩晨0-7點之間每隔一小時的每分鐘都在再行重新開機apache

8)0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart

每月的4号與每周一到周三的11點重新開機apache(周和日盡量不要同時使用)

9)0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart

一月一号的4點重新開機apache

​​連結參考​​

其他

cron定時任務詳解

root可以建立普通使用者cron計劃任務 crontab -e -u wgp

crond不能守護秒級定時任務,通常秒級的定時任務需要自己寫shell腳本

#!/bin/bash

whith true

do

echo "hello world!" >>/tmp/log.txt

sleep 1

done

sh test.sh & 放到背景執行

tail -f /tmp/log.txt 檢視檔案變化

在編輯裡面要加上注釋來區分是誰編寫的

00 09,14 * * 6,0 /bin/bash /server/scripts/test.sh >/dev/null 2>&1

每周六,日的上午九點和下午14點執行test.sh,并把标準錯誤2和标準輸出1定位到空檔案

*/1 * * * * echo + >>/tmp/log.log >/dev/null 2>&1

注意:定時規則如果是指令在已經有了一個重定向符号>>,再加上一個重定向/dev/null 2>&1,是沒有結果的

指令放定時任務裡面,時間的%必需要轉義\%

cron服務的日志檔案在/var/log/cron檔案下

要注意環境變量給定時任務帶來的影響,特别是與java服務相關的變量,定時任務隻能識别很少的系統變量,同時也要避免不必要的指令列印輸出

​​Quartz​​可以實作秒級任務

cron定時任務詳解

crond編輯三種定時方式

第一種:在/etc/crontab下設定,指定使用者名的(不專業寫法,一般不寫在這裡面)

1、vim指令進入/etc/crontab

2、在最後一行加上

59 23 * * * root /root/catalina.out.rm/rm_8080_8081_catalina.sh

如下說明:

cron定時任務詳解

3、重新開機crontab,使配置生效

/bin/systemctl restart crond.service

第二種:直接用crontab -e,不需要指定使用者,如果是root權限,預設是root定時的

1、crontab -e進入

cron定時任務詳解

2、:wq退出儲存

3、檢視上面那個腳本是否有執行權限

cron定時任務詳解

4、還要看腳本裡面的涉及的操作檔案是否有權限

5、重新開機crontab,使配置生效

/bin/systemctl restart  crond.service

cron定時任務詳解

第三種:直接寫入/var/spool/cron/root(是使用者名稱)

1.vi  /var/spool/cron/root

cron定時任務詳解

2.儲存退出,crontab -l

cron定時任務詳解

3.tail -f /tmp/log.log

cron定時任務詳解

crontab定時任務執行不成功

1.檢視定時任務有沒有開啟

2.符号*号是否弄懂,是否寫錯,代表每一分鐘,小時,日,月,周

3.執行權限等等

4.執行的腳本或者寫入檔案的目錄是否存在,是否是絕對路徑

5.是否有系統變量,定時任務對系統變量的識别很少,比如寫個tomcat定時關機,手工ok,但是腳本就是不執行

6.指令放定時任務裡面,時間的%必需要轉義\%

7.多看定時任務日志

8.企業故障案例一

windows定時任務