crontab遇過的坑
定時迴圈任務是由linux上的crond系統服務來控制的,這個系統服務實現是以守護程序的方式實現,守護程序的詳解戳文章;
linux提供給使用者程序控制定時任務的命令為crontab,由crontab設定後實現使用者自定義的定時任務;
[root@wefang ~]# crontab [-u username] [-l|-e|-r]
選項與引數:
-u : 只有root才能執行這個任務;
-e : 編輯crontab的任務內容(常用);
-l : 檢視crontab的任務內容;
-r : 刪除所有的crontab任務,若僅要刪除一項,用-e去編輯;
代表意義
分鐘小時
日期月份周命令
數字範圍
0-59
0-23
1-31
1-12
0-7需要執行的命令
注意:周的0和7都是代表週日的意思
注意到在上圖中,除了數字外,還有特殊符號佔據了項的內容,特殊符號的含義如下:
特殊字元
代表意義
*代表任何時刻。就是「每」的 意思,如 * * * * * command,就是在crontab中註冊了乙個每分鐘,每小時,每天,每月每週都發生的command;
,用於分隔時段,逗號分隔的數字都會發生。如需要任務在每天8點和12點發生,即命令為 0 8,12 * * * command
-用於一段持續的時間,如需要在8點到12點每個小時都發生一次,即命令為 0 8-12 * * * command
/nn是乙個數字,代表「每隔」n個時間發生一次,如需要五分鐘發生一次 ,即命令為 */5 * * * * command
/etc/cron.allow定義可以使用crontab的賬號,不在這個檔案內的使用者就不能使用crontab;
/etc/cron.deny定義不能夠使用crontab的賬號,不在這個檔案內的使用者就可以使用crontab;
crontab命令由crond程序實現,在重新寫crontab命令後,要對crond程序重啟服務或重新載入配置才ok;
crond的各項操作如表所示:
命令代表含義
service crond start
啟動服務
service crond stop
關閉服務
service crond restart(/bin/systemctl restart crond.service)
重啟服務
service crond reload
重新載入配置
service crond status
檢視服務狀態
crontab命令執行的日誌目錄為/var/log/cron,可以在cron中看到crontab執行的內容,如果你不確定你的crontab命令寫的是否正確,檢視日誌便知道是否有問題;
週末寫了個init.sh定時指令碼監控乙個程序是否啟動,若沒有啟動則將程序拉起,若起了多個程序,則將全部程序乾掉,重新拉起,每一分鐘執行一次;
init.sh的shell**如下:
#!/usr/bin/env bash
dir_path=
'/usr/local/'
file_path=
$"monitor.py"
monitor_num=
`ps -ef |
grep monitor |
grep -v grep
|grep -v vim |
wc -l`
log_file=
`find $dir_path -name "monitor_2019*"
|sort -r |
head -n 1 |
awk -f'/'''`
echo
"init start"if[
$monitor_num -eq 0 ]
;then
now=
`date
'+%y-%m-%d %h:%m:%s'
` #echo "start monitor at:" $now >> $log_file
#echo $file_path
/usr/bin/python $file_path&if
[$?=='0'];
then
echo
"start monitor success at:"
$now
>>
$log_file
else
echo
"start monitor fail at:"
$now
>>
$log_file
fielif
[$monitor_num -gt 1 ]
;then
ps -ef |
grep monitor|
grep -v grep
|cut -c 9-15|
xargs
kill -9
/usr/bin/python $file_path&if
[$?=='0'];
then
echo
"start monitor success at:"
$now
>>
$log_file
fi# if montor_num == 1, normal
# do nothing
fi
配置的crontab命令如下:
* * * * * cd /usr/local/monitor.py; /bin/sh init.sh
配置完了之後,發現每分鐘這個init.sh都會被觸發一次,然後判斷monitor程序沒有啟動;發現monitor程序沒有啟動後,啟動monitor。但是monitor程序一直沒有被拉起,然後就一直拉,也沒有效果。
手動執行了一下init.sh指令碼,發現monitor程序直接被拉起,也沒見什麼異常,說明init.sh指令碼應該沒什麼問題;
最後定位到問題,是因為沒有在init.sh指令碼中加入路徑:
export path=
$path:/usr/bin/:/sbin/:/usr/sbin/:/bin/
同理,如果用crontab的shell指令碼拉起python的指令碼時,也需要加入python的環境變數。
加入了路徑之後就ok啦,一切符合預期要求,測試通過,以後如果遇到這樣同樣的問題,要考慮下,是否是指令碼的路徑問題,最好都配置乙個全路徑,就再也不會出錯了。
Linux linux定時任務crontab
crontab命令的功能是在一定的時間間隔排程一些命令的執行。它的配置檔案是 etc crontab。vim etc crontab etc crontab中每行指定乙個定時任務,其描述格式如下 minute hour daymonth dayofweek commandminute 從0到59的整...
linux定時任務 at定時任務
at命令是一次性定時計畫任務,at的守護程序atd會以後臺模式執行,檢查作業佇列來執行作業。atd守護程序會檢查系統上的乙個特殊目錄來獲取at命令的提交的作業,預設情況下,atd守護程序每60秒檢查一次目錄,有作業時,會檢查作業執行時間,如果時間與當前時間匹配,則執行此作業。注意 at命令是一次性定...
linux定時任務
crontab 設定定時任務 crontab 可以根據分鐘 小時 日期 月份 星期的組合來設定定時任務的自動執行 要使用該服務必須啟動 crond 服務,檢視 crond 服務有沒有啟動,執行命令 servicecrond status 一些任務事例,幫助理解 3020 root back.sh 每...