1. 程式人生 > 實用技巧 >crontab--定時執行任務

crontab--定時執行任務

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 )

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,每隔五分鐘執行一次

基本使用

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

連結參考

其他

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可以實現秒級任務

crond編輯三種定時方式

第一種:在/etc/crontab下設定,指定使用者名稱的(不專業寫法,一般不寫在這裡面) 1、vim命令進入/etc/crontab 2、在最後一行加上 59 23 * * * root /root/catalina.out.rm/rm_8080_8081_catalina.sh 如下說明: 3、重啟crontab,使配置生效 /bin/systemctl restart crond.service 第二種:直接用crontab -e,不需要指定使用者,如果是root許可權,預設是root定時的 1、crontab -e進入 2、:wq退出儲存 3、檢視上面那個指令碼是否有執行許可權 4、還要看腳本里面的涉及的操作檔案是否有許可權 5、重啟crontab,使配置生效 /bin/systemctl restart crond.service 第三種:直接寫入/var/spool/cron/root(是使用者名稱稱) 1.vi/var/spool/cron/root

2.儲存退出,crontab -l

3.tail -f /tmp/log.log

crontab定時任務執行不成功

1.檢視定時任務有沒有開啟 2.符號*號是否弄懂,是否寫錯,代表每一分鐘,小時,日,月,周 3.執行許可權等等 4.執行的指令碼或者寫入檔案的目錄是否存在,是否是絕對路徑 5.是否有系統變數,定時任務對系統變數的識別很少,比如寫個tomcat定時關機,手工ok,但是指令碼就是不執行 6.命令放定時任務裡面,時間的%必需要轉義\% 7.多看定時任務日誌 8.企業故障案例一(https://www.cnblogs.com/p0st/p/9720120.html)