Linux定時任務crontab詳解

2021-09-26 18:32:19 字數 3266 閱讀 7041

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 每...