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.企業故障案例一
windows定時任務