linux系統提供at和crontab兩個命令來執行定時任務,at主要針對一次性的定時任務,crontab則執行周期性的定時任務。在linux運維中使用較多的還是cronjob,當安裝完linux系統後,linux會自動啟動crond進程,這是周期性任務的守護進 程,用於檢查是否有需要執行的定時任務。

crontab命令常用參數:
- crontab file [-u user] -用指定的文件替代目前的crontab.
- crontab -[-u user] -用標準輸入替代目前的crontab.
- crontab -l [user] -顯示當前存在的crontab任務 .
- crontab -e [user] -用於編輯創建crontab文件任務 .
- crontab -r [user] -刪除當前用戶crontab文件(文件保存路徑為/var/spool/cron/username) .
- crontab -c dir -指定crontab的目錄。
創建一個新的crontab文件
在考慮向cron進程提交一個crontab文件之前,首先要做的一件事情就是設置環境變量EDITOR。cron進程根據它來確定使用哪個編輯器編輯crontab文件。大多數用戶都使用vi,如果你和小編一樣也是使用vi,直接編輯$ HOME目錄下的. profile文件,在當中加入:
EDITOR=vi; export EDITOR ~ source .bash_profile
crontab命令時間格式設置
crontab任務字段共六個,前五個為時間字段分別為:分 時 日 月 周;第六個為執行命令字段,可以是單條命令或者腳本文件。時間字段可以使用特殊字符,’*’代表所有可能值,’,’代表選定時間段,’-‘代表選定時間範圍,’/’代表時間間隔頻率。

舉個例子:
➜ ~ crontab -l */1 10-14 24,25 * * echo `date` >> /root/date.log
含義為:每個月的24、25號10點到14點每隔一分鐘輸出一個date日期到/root/date.log文件中。
➜ ~ crontab -l 30 21 * * * /usr/local/etc/rc.d/lighttpd restart
含義為:每晚的21:30重啟apache。
基礎的設置和使用我們已經了解了,但是當我們創建完成cronjob任務後,卻經常發現crontab定時任務不執行,着實讓人鬱悶!沒關係,往下看~
crontab定時任務不執行排查思路
兩個重要目錄文件
關於crontab任務,我們需要知道幾個目錄文件。這些文件對於我們分析crontab定時任務不執行的原因非常有用。
- /var/log/cron,用於記錄crontab任務執行日誌的文件,不論執行成功與否都會被記錄。
- /var/spool/mail/username,用於記錄crontab任務執行失敗日誌的文件,linux系統中每個定時任務執行後,系統都會將 失敗的任務信息通過電子郵件的形式發送給當前系統用戶。
執行失敗排查過程(舉例)
我創建一個定時任務每分鐘關閉一次iptables任務,但是iptables並未被關閉。
查看日誌 tail /var/spool/mail/root,發現不存在這個service命令目錄 :

➜ ~ which service /usr/sbin/service ➜ ~ crontab -e */1 * * * * /usr/sbin/service iptables stop ,即可解決這個問題。
這個例子反映了一個普遍存在的現象,當我們在當前shell中執行腳本沒有任何問題,但是一寫到cronjob中就會出現各種問題,這個是因為cronjob並不會自動加載我們腳本所需的各種環境變量,我們需要手動添加到cronjob任務中才能確保cronjob正常運行。
解決辦法修改:
➜ ~ crontab -l SHELL=/bin/sh PATH=PATH=/sbin:/bin:/usr/sbin:/usr/bin */1 * * * * service iptables stop
對於python腳本或者mongodb腳本無法定時執行都可以採用這種辦法解決。
其他容易忽略導致無法執行cronjob的原因:
- 定時任務路徑問題,在cronjob中最好使用絕對路徑來定位腳本或者輸出文件。
- 腳本權限問題,修改腳本權限,通常來說chmod 777即可。
- 系統時間問題,校準系統時間。
- crond服務問題,確保服務狀態正常,service crond status。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/208859.html