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"表示分鍾的話即每十分鍾執行一次
如果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 中一樣的語法。