1. 程式人生 > 其它 >CentOS 定時計劃任務設定

CentOS 定時計劃任務設定

一、安裝crontab服務並設定開機自啟

yum install crontabs  (centos預設就會帶,一般不需要安裝)
systemctl enable crond (設為開機啟動)
systemctl start crond(啟動crond服務)
systemctl status crond (檢視狀態)

二、設定使用者自定義定時任務

vim /etc/crontab
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # 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

  定義了MAILTO這個變數,那麼crontab會將stdout的內容以郵件的形式傳送到MAILTO定義的郵箱中。(MAILTO=myuser@163.com

  分鐘(0-59) 小時(0-23) 日(1-31) 月(11-12) 星期(0-6,0表示週日) 使用者名稱 要執行的命令

示例:

vim /etc/crontab
# 每天,每5分鐘執行一次 myshell.sh指令碼 */5 * * * root /data/myshell.sh # 每天凌晨二點,執行命令指令碼,這裡由於第一個的分鐘沒有設定,那麼就會每天凌晨2點的每分鐘都執行一次命令 * 2 * * * root /data/myshell.sh # 每天凌晨二點整執行一次命令指令碼 0 2 * * * root /data/myshell.sh # 每天11點到13點之間,每10分鐘執行一次命令指令碼 */10 11-13 * * * root /data/myshell.sh # 每小時的10-30分鐘,每分鐘執行一次命令指令碼,共執行20次 10-30 * * * * root /data/myshell.sh # 每小時的10,30分鐘,分別執行一次命令指令碼,共執行2次 10,30 * * * * * root /data/myshell.sh # 週一到週五每天的9點到14點,每5min執行一次python指令碼 */5 9-14 * * 1-5 /root/gold.py # 週一到週五的15點到15點35分,每5min執行一次python指令碼 0-35/5 15 * * 1-5 /root/gold.py

注意:
crond的計劃任務並不會呼叫使用者設定的環境變數,在執行計劃任務時,用的時crond自己的環境變數,所以有些指令碼手工執行是可以的,但是計劃任務就不行,此時要麼寫指令碼的絕對路徑,要麼將環境便倆個新增到/etc/crontab中;

遇到的問題:

# */5 9-14 * * 1-5 root /usr/local/python3/bin/python3 /root/gold.py
這種寫法雖然指令碼能執行成功,但是cron的執行日誌中會有相關的報錯,看著很不爽,於是就有了下面這種寫法;
# */5 9-14 * * 1-5 /root/gold.py 這種寫法有一個前提,需要指定執行指令碼的直譯器,也就是"#!/usr/local/python3/bin/python3";
不知道是不是我是root的緣故,當在cron中加入執行使用者root時,指令碼能執行成功,但是cron的執行日誌中仍然會報錯,於是就乾脆取消了,不知道普通使用者狀態下會不會出現這種問題;(測試系統:CentOS 7.7)

三、儲存生效

# 載入任務使其生效
crontab /etc/crontab (每一次的改動都需要執行,否則不生效)

# 檢視任務
crontab -l

# 直接編輯
crontab -e      (或者直接vim /etc/crontab)
注意:如果第一次寫計劃任務直接執行crontab -e,則計劃任務檔案是儲存在/tmp目錄下的,關機重啟會失效;所以推薦"vim /etc/crontab";