Linux 中的定時處理 cron服務


cron服務

在LINUX中,周期執行的任務一般由cron這個守護進程來處理

當安裝完操作系統后默認會安裝此服務工具並且會自動啟動crond,該進程會每分鍾定期檢查是否有要執行的任務,若有則執行。

cron服務運行的最小單位是分鍾,也就是每分鍾cron服務加載一次配置文件,所以我們不能實現每秒鍾運行一次cron中的配置項.

cron服務啟動或關閉

由於Cron 是Linux的內置服務,可以用以下的方法啟動、關閉這個服務:

/sbin/service crond start //啟動服務 /sbin/service crond stop //關閉服務 /sbin/service crond restart //重啟服務 /sbin/service crond reload //重新載入配置

cron任務文件(配置文件)

cron在3個地方查找配置文件,這些配置文件我們稱之為crontab文件,其中包含了命令行及其調用時間

1.  /etc/crontab  (系統任務調度)
這個文件存着系統級的任務。它主要用來運行每日的(daily),每周的(weekly),每月的(monthly)的任務。一般不在此文件安裝自己的任務

2.  /etc/cron.d/
此目錄下存放的是系統級任務的任務文件。

3.  /var/spool/cron/ (用戶任務調度)
此目錄下存放各個用戶的任務文件。各個用戶的任務存放在以自已用戶名為文件名的任務文件中。此文件中的指令行沒有用戶域。

 

cron日志文件

可以通過查看文件/var/log/cron查看任務的運行情況。

 

cron任務文件的編輯

1.可以直接到上面提到的三個位置直接編輯相關的crontab文件

2.也可以通過crontab -e命令進行編輯

通過crontab -e進行編輯,實際上就是編輯/var/spool/cron/目錄下的當前用戶或者指定用戶(-u)的crontab文件(以用戶名命名的crontab文件)

3.還可以通過添加file的方式,例如先編寫cron腳本,命名為testFile.cron,腳本內容的格式和/etc/crontab文件給出注釋格式一樣,執行crontab testFile.cron;

crontab命令選項

crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
注:
-u user:用於設定某個用戶的crontab,此參數一般由root來運行,不指定的默認情況下是當前登陸的用戶
file:是命令文件的名字,表示file作為crontab的任務列表文件並載入crontab,若未指定將接受鍵盤上鍵入的命令
-e:進入當前用戶的定時任務文件編輯模式
-l:顯示當前用戶的定時任務文件的命令列表
-r:刪除當前用戶的crontab文件,也可-u刪除指定用戶的
-i:在刪除用戶crontab文件時給確認提示

crontab –e : 修改/var/spool/cron目錄下當前用戶的 crontab 文件. 如果文件不存在會自動創建,文件名與用戶名相同。可以使用-u選項修改指定用戶的 crontab文件 
crontab –l : 顯示當前用戶的 crontab 文件中的任務計划。 可以使用-u選項顯示指定用戶的 crontab文件 
crontab -r : 刪除當前用戶的 crontab 文件。可以使用-u選項刪除指定用戶的 crontab文件 
crontab -ir : 刪除 crontab 文件前提醒用戶。

 

cron文件語法與寫法

每行都包括六個域,其中前五個域是指定命令被執行的時間最后一個域是要被執行的命令

每個域之間使用空格或者制表符分隔

{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} 

 

 minute: 區間為 0 – 59 
 hour: 區間為0 – 23 
 day-of-month: 區間為1 – 31 
 month: 區間為1 – 12. 1 是1月. 12是12月. 
 Day-of-week: 區間為0 – 7. 周日可以是0或7.

 

時間域,除了以上的數字可以填入,還可搭配符號一起:

# 星號(*):代表所有可能的值
# 逗號(,):可以用逗號隔開的值指定一個列表范圍,eg:"1,3,5,7,9"
# 中杠(-):可以用整數之間的中杠表示一個整數范圍,eg:"1-5",即表示"1,2,3,4,5"
# 正斜線(/):可以用正斜線指定時間的間隔頻率,eg:"*/10"表示分鍾的話即每十分鍾執行一次

 

crontab表達式,前面四項的關系之間為and的關系,需要同時滿足才能執行;
但星期那一項與前面月份日期是or的關系,只需滿足其一即執行;
 
關於星期和月日的關系,也就是 日期(幾月幾日)和星期的關系,個人總結一下,不一定對
日 月 星期 均為* 時,如 10 10 * * * 相當於每一天都要處理,不需要區分日和星期
日 月 為* ,星期 不為* 時,如 10 10 * * 1 則忽略日月只看星期,即每周一10點10分執行
日 月 不全為* ,星期為* 時,如 10 10 1* * 則忽略星期只看日月,即每月1日10點10分執行
日 月 不全為*,星期 不為* 時,如 10 10 1 * 1 則日月和星期是出於or的關系,即每月1號的10點10分和每周一的10點10分執行
10 10 * 1 1  每年1月的每一天的10點10分和每周一的10點10分執行
 

如果day_of_month和day_of_week同時存在,day_of_month和day_of_week是不能同時起作用的,或者說不是我想象中的and的關系,而是or的關系。

例如:在每個月的1~13號的周1,2,4,5的早上8點執行命令。

想當然的去寫:

    * 8 1-13 * 1,2,4,5 data>/opt/tmpFile/testCrontab

是達不到想要的效果,因為day_of_month 和 day_of_week 同時設置的情況下是or的關系,即會出現這樣的情況,

每個月的1~13號會執行和所有的周1,2,4,5都會執行這條命令,顯然這不是我們想要的結果。
處理方法是,將命令data>/opt/tmpFile/testCrontab單獨寫到一個腳本里面去,並在這個腳本里面加上對時間的判斷

 

實例

每秒執行一次

  最小執行單位為分鍾,秒無法實現

每分鍾執行一次

  * * * * * 

每小時執行一次

  0 * * * * 

每天執行一次

  0 0 * * * 

每周執行一次

  0 0 * * 0

每月執行一次

  0 0 1 * *

每年執行一次

  0 0 1 1 *

每5分鍾執行一次

  */5 * * * *  

每2小時執行一次

  0 */2 * * * 

每3天執行一次

  0 0 */3 * *

每3月執行一次

  0 0 1 */3 *

每小時10分和15分執行一次

  10,15 * * * *

每天1點和3點執行一次

  0 1,3 * * *

每月1號和3號分別執行一次

  0 0 1,3 * *

每年1月和3月分別執行一次

  0 0 1 1,3 *

每年1月至3月分別執行一次

  0 0 1 1-3 *

 

關於cron配置文件/etc/crontab

cron 的主配置文件是 /etc/crontab,它包括下面幾行:

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

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly 

前四行是用來配置 cron 任務運行環境的變量:

Shell 變量的值指定shell 環境(此處默認為 bash shell);

PATH 變量定義用來執行命令的程序路徑;

cron 任務的輸出被郵寄給 MAILTO 變量定義的用戶名,如果 MAILTO 變量被定義為空白字符串(MAILTO=""),電子郵件就不會被寄出;

HOME 變量可以用來設置在執行命令或腳本時使用的主目錄。

如在 /etc/crontab 文件中run-parts部分所示,它使用 run-parts 腳本來執行存在於 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 目錄中的腳本,這些腳本被相應地按照預設時間在每小時、每日、每周、或每月執行。這些目錄中的文件應該是 shell 腳本,並且具有可執行權限(chmod +x filename)。

如果某 cron 任務需要根據調度來執行,而不是每小時、每日、每周、或每月地執行,它可以被添加到/etc/cron.d目錄中。該目錄中的所有文件使用和 /etc/crontab 中一樣的語法。

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM