Crontab是一個用於設置週期性執行任務的工具,能夠設置按照分鐘、小時、天、周、月來執行。apache
週期性執行的任務稱爲Cron Job,週期性執行的任務列表稱爲Cron Table。
服務器
能夠在命令行終端經過執行crontab -l或者service crond status命令來查看Crontab是否正常按照和啓動。以下圖所示顯示服務器的Crontab服務已經處於運行狀態,對於root用戶來講尚未須要執行的計劃任務。
工具
經過一個簡單示例來演示一下如何使用Crontab:*/1 * * * * date >> /tmp/date.log,每分鐘輸出當前時間到/tmp/date.log文件中。
spa
第一步:執行命令crontab -e
命令行
第二步:按下字母i鍵進入插入狀態,輸入*/1 * * * * date >> /tmp/date.logrest
第三部:按下Esc鍵退出插入狀態,輸入:wq,保存並退出,此時定時任務設置完成
日誌
第四部:執行命令tail -f /tmp/date.log,查看文件內容是不是一分鐘增長一行當前時間。確認後Ctrl + c退出便可。
crontab
因此,總結一句話就是Linux計劃任務服務crond利用crontab工具來修改相關配置文件,從而實現定時任務。
字符串
配置格式說明test
案例說明 :星號表示任什麼時候間都匹配,逗號表示匹配幾個固定時間,減號表示匹配時間段,斜線表示每隔一段時間
天天晚上23:30重啓apache服務:30 23 * * * service httpd restart
每個月1日、10日、20日的晚上23:30重啓apache服務:30 23 1,10,20 * * service httpd restart
每個月1日至10日的晚上23:30重啓apache服務:30 23 1-10 * * service httpd restart
每隔2分鐘重啓apache服務:*/2 * * * * service httpd restart、1-59/2 * * * * service httpd restart
天天晚上23點到第二天7點,每隔1小時重啓apache服務:0 23-7/1 * * * service httpd restart
天天晚上18點到23點,每隔30分鐘重啓apache服務:0,30 18-23 * * * service httpd restart
crontab命令說明
-u:指定查看或者編輯哪一個用戶的計劃任務,不指定用戶時默認爲當前登陸用戶
-e:編輯計劃任務的配置文件
-l:列出配置文件中的計劃任務列表
案例說明:
第一步:使用crontab -u root -e給root用戶增長計劃任務:1-59/2 * * * * echo "root's crontab execute..."
第二步:使用crontab -u test -e給test用戶增長計劃任務:0-58/2 * * * * echo "test's crontab execute..."
第三步:使用tail -f /var/log/cron查看計劃任務的執行歷史
配置文件說明
全局配置文件:/etc/crontab,經過查看其內容發現其命令格式中多了一個指定用戶的地方。
還有一些與該文件做用相似的配置文件:
咱們能夠觀察/var/log/cron文件中的日誌內容:
而經過crontab -e修改的內容並無在上面的配置文件中保存,那在哪裏呢?/var/spool/cron/。
環境變量:經過expor設置的環境變量是不可以直接在計劃任務中直接使用的。
命令行雙引號中使用百分號%時,未加反斜線\
第三個和第五個域是「或」的的關係,即配置分鐘、小時、日、月、星期幾中的日和星期幾是或者的關係,不是而且的關係。
如:每個月第一個星期日早晨1:59執行腳本test.sh
錯誤的寫法:59 1 1-7 * 0 /root/test.sh
正確的寫法:59 1 1-7 * * test `date + \%w` -eq 0 && /root/test.sh
分析:錯誤的寫法錯誤的緣由在於1-7解析爲每個月的1日到7日,星號後面的0表明週日,因爲二者是或者的關係,因此真正表達的含義是每個月的1日到7日或者是週日的1:59執行腳本。
分鐘設置誤用
在使用其餘單位進行設定週期時,分鐘不要設置爲星號*,要設置爲0。
補充:如何經過crontab實現以秒爲單位的計劃任務?
例:執行命令:date;sleep 0.5s;date,屢次執行後能夠感受到兩個date命令之間會有一段時間間隔
因此咱們能夠經過sleep與crontab結合的方式實現以秒爲單位的計劃任務。
*/1 * * * * echo "start"
*/1 * * * * sleep 30s;echo "start..."
分析以上兩個計劃任務,目的都是每分鐘輸出字符串「start...」,可是因爲第二個計劃任務在輸出字符串以前先sleep30秒,這樣就和第一個計劃任務隔開了30秒的時間,可是實現了統一計劃任務的以秒爲單位來執行的目的。