在 Linux 中,任務能夠被配置在指定的時間段、指定的日期、或系統平均載量低於指定的數量時自動運行。紅帽企業 Linux 預配置了對重要系統任務的運行,以便使系統可以時時被更新。譬如,被 locate 命令使用的 slocate 數據庫每日都被更新。系統管理員可以使用自動化的任務來執行按期備份、監控系統、運行定製腳本等等。shell
紅帽企業 Linux 隨帶幾個自動化任務的工具:cron、at、和 batch。數據庫
cron 是一個能夠用來根據時間、日期、月份、星期的組合來調度對重複任務的執行的守護進程。apache
cron 假定系統持續運行。若是當某任務被調度時系統不在運行,該任務就不會被執行。bash
要使用 cron 服務,你必須安裝了 vixie-cron RPM 軟件包,並且必須在運行 crond 服務。要斷定該軟件包是否已安裝,使用 rpm -q vixie-cron 命令。要斷定該服務是否在運行,使用 /sbin/service crond status 命令。dom
cron 的主配置文件是 /etc/crontab,它包括下面幾行:編輯器
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # 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 文件中的每一行都表明一項任務,它的格式是:url
minute hour day month dayofweek command |
minute — 分鐘,從 0 到 59 之間的任何整數spa
hour — 小時,從 0 到 23 之間的任何整數rest
day — 日期,從 1 到 31 之間的任何整數(若是指定了月份,必須是該月份的有效日期)
month — 月份,從 1 到 12 之間的任何整數(或使用月份的英文簡寫如 jan、feb 等等)
dayofweek — 星期,從 0 到 7 之間的任何整數,這裏的 0 或 7 表明星期日(或使用星期的英文簡寫如 sun、mon 等等)
command — 要執行的命令(命令能夠是 ls /proc >> /tmp/proc 之類的命令,也能夠是執行你自行編寫的腳本的命令。)
在以上任何值中,星號(*)能夠用來表明全部有效的值。譬如,月份值中的星號意味着在知足其它制約條件後每個月都執行該命令。
整數間的短線(-)指定一個整數範圍。譬如,1-4 意味着整數 一、二、三、4。
用逗號(,)隔開的一系列值指定一個列表。譬如,3, 4, 6, 8 標明這四個指定的整數。
正斜線(/)能夠用來指定間隔頻率。在範圍後加上 /<integer> 意味着在範圍內能夠跳過 integer。譬如,0-59/2 能夠用來在分鐘字段定義每兩分鐘。間隔頻率值還能夠和星號一塊兒使用。例如,*/3 的值能夠用在月份字段中表示每三個月運行一次任務。
開頭爲井號(#)的行是註釋,不會被處理。
如你在 /etc/crontab 文件中所見,它使用 run-parts 腳原本執行 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 目錄中的腳本,這些腳本被相應地每小時、每日、每週、或每個月執行。這些目錄中的文件應該是 shell 腳本。
若是某 cron 任務須要根據調度來執行,而不是每小時、每日、每週、或每個月地執行,它能夠被添加到 /etc/cron.d 目錄中。該目錄中的全部文件使用和 /etc/crontab 中同樣的語法。
# record the memory usage of the system every monday # at 3:30AM in the file /tmp/meminfo 30 3 * * mon cat /proc/meminfo >> /tmp/meminfo # run custom script the first day of every month at 4:10AM 10 4 1 * * /root/scripts/backup.sh |
例 37-1. crontab 的例子
根用戶之外的用戶可使用 crontab 工具來配置 cron 任務。全部用戶定義的 crontab 都被保存在 /var/spool/cron 目錄中,並使用建立它們的用戶身份來執行。要以某用戶身份建立一個 crontab 項目,登陸爲該用戶,而後鍵入 crontab -e 命令,使用由 VISUAL 或 EDITOR 環境變量指定的編輯器來編輯該用戶的 crontab。該文件使用的格式和 /etc/crontab 相同。當對 crontab 所作的改變被保存後,該 crontab 文件就會根據該用戶名被保存,並寫入文件 /var/spool/cron/username 中。
cron 守護進程每分鐘都檢查 /etc/crontab 文件、etc/cron.d/ 目錄、以及 /var/spool/cron 目錄中的改變。若是發現了改變,它們就會被載入內存。這樣,當某個 crontab 文件改變後就沒必要從新啓動守護進程了。
/etc/cron.allow 和 /etc/cron.deny 文件被用來限制對 cron 的使用。這兩個使用控制文件的格式都是每行一個用戶。兩個文件都不容許空格。若是使用控制文件被修改了,cron 守護進程(crond)沒必要被重啓。使用控制文件在每次用戶添加或刪除一項 cron 任務時都會被讀取。
不管使用控制文件中的規定如何,根用戶都老是可使用 cron。
若是 cron.allow 文件存在,只有其中列出的用戶才被容許使用 cron,而且 cron.deny 文件會被忽略。
若是 cron.allow 文件不存在,全部在 cron.deny 中列出的用戶都被禁止使用 cron。
要啓動 cron 服務,使用 /sbin/service crond start 命令。要中止該服務,使用 /sbin/service crond stop 命令。推薦你在引導時啓動該服務。
-----
Linux——Crontab使用詳解
名稱 : crontab
使用權限 : 全部使用者
使用方式 :
crontab file [-u user]-用指定的文件替代目前的crontab。
crontab-[-u user]-用標準輸入替代目前的crontab.
crontab-1[user]-列出用戶目前的crontab.
crontab-e[user]-編輯用戶目前的crontab.
crontab-d[user]-刪除用戶目前的crontab.
crontab-c dir- 指定crontab的目錄。
crontab文件的格式:M H D m d cmd.
基本格式 :
* * * * * command
分 時 日 月 周 命令
M: 分鐘(0-59)。每分鐘用*或者 */1表示
H:小時(0-23)。(0表示0點)
D:天(1-31)。
m: 月(1-12)。
d: 一星期內的天(0~6,0爲星期天)。
cmd要運行的程序,程序被送入sh執行,這個shell只有USER,HOME,SHELL這三個環境變量
說明 :
crontab 是用來讓使用者在固定時間或固定間隔執行程序之用,換句話說,也就是相似使用者的時程表。-u user 是指設定指定 user 的時程表,這個前提是你必需要有其權限(好比說是 root)纔可以指定他人的時程表。若是不使用 -u user 的話,就是表示設定本身的時程表。
參數 :
crontab -e : 執行文字編輯器來設定時程表,內定的文字編輯器是 VI,若是你想用別的文字編輯器,則請先設定 VISUAL 環境變數來指定使用那個文字編輯器(好比說 setenv VISUAL joe)
crontab -r : 刪除目前的時程表
crontab -l : 列出目前的時程表
crontab file [-u user]-用指定的文件替代目前的crontab。
時程表的格式以下 :
f1 f2 f3 f4 f5 program
其中 f1 是表示分鐘,f2 表示小時,f3 表示一個月份中的第幾日,f4 表示月份,f5 表示一個星期中的第幾天。program 表示要執行的程序。
當 f1 爲 * 時表示每分鐘都要執行 program,f2 爲 * 時表示每小時都要執行程序,其餘類推
當 f1 爲 a-b 時表示從第 a 分鐘到第 b 分鐘這段時間內要執行,f2 爲 a-b 時表示從第 a 到第 b 小時都要執行,其餘類推
當 f1 爲 */n 時表示每 n 分鐘個時間間隔執行一次,f2 爲 */n 表示每 n 小時個時間間隔執行一次,其餘類推
當 f1 爲 a, b, c,... 時表示第 a, b, c,... 分鐘要執行,f2 爲 a, b, c,... 時表示第 a, b, c...個小時要執行,其餘類推
使用者也能夠將全部的設定先存放在檔案 file 中,用 crontab file 的方式來設定時程表。
例子 :
#天天早上7點執行一次 /bin/ls :
0 7 * * * /bin/ls
在 12 月內, 天天的早上 6 點到 12 點中,每隔3個小時執行一次 /usr/bin/backup :
0 6-12/3 * 12 * /usr/bin/backup
週一到週五天天下午 5:00 寄一封信給 alex@domain.name :
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
每個月天天的午夜 0 點 20 分, 2 點 20 分, 4 點 20 分....執行 echo "haha"
20 0-23/2 * * * echo "haha"
注意 :
當程序在你所指定的時間執行後,系統會寄一封信給你,顯示該程序執行的內容,如果你不但願收到這樣的信,請在每一行空一格以後加上 > /dev/null 2>&1 便可
例子2 :
#天天早上6點10分
10 6 * * * date
#每兩個小時
0 */2 * * * date
#晚上11點到早上8點之間每兩個小時,早上8點
0 23-7/2,8 * * * date
#每月的4號和每一個禮拜的禮拜一到禮拜三的早上11點
0 11 4 * mon-wed date
#1月份日早上4點
0 4 1 jan * date
範例
$crontab -l 列出用戶目前的crontab.
/usr/lib/cron/cron.allow表示誰能使用crontab命令。若是它是一個空文件代表沒有一個用戶能安排做業。若是這個文件不存在,而有另一個文件/usr/lib/cron/cron.deny,則只有不包括在這個文件中的用戶纔可使用crontab命令。若是它是一個空文件代表任何用戶均可安排做業。兩個文件同時存在時cron.allow優先,若是都不存在,只有超級用戶能夠安排做業。
crontab文件的一些例子:
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重啓apache。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每個月一、十、22日的4 : 45重啓apache。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每週6、週日的1 : 10重啓apache。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在天天18 : 00至23 : 00之間每隔30分鐘重啓apache。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重啓apache。
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小時重啓apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11點到早上7點之間,每隔一小時重啓apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每個月的4號與每週一到週三的11點重啓apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一號的4點重啓apache
例子:
每兩個時間值中間使用逗號分隔。
除了數字還有幾個個特殊的符號就是」*」、」/」和」-」、」,」,*表明全部的取值範圍內的數字,」/」表明每的意思,」*/5″表示每5個單位,」-」表明從某個數字到某個數字,」,」分開幾個離散的數字。
天天早上6點
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意單純echo,從屏幕上看不到任何輸出,由於cron把任何輸出都email到root的信箱了。
每兩個小時
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
晚上11點到早上8點之間每兩個小時,早上八點
0 23-7/2,8 * * * echo "Have a good dream:)" >> /tmp/test.txt
每月的4號和每一個禮拜的禮拜一到禮拜三的早上11點
0 11 4 * 1-3 command line
1月1日早上4點
0 4 1 1 * command line
每次編輯完某個用戶的cron設置後,cron自動在/var/spool/cron下生成一個與此用戶同名的文件,此用戶的cron信息都記錄在這個文件中,這個文件是不能夠直接編輯的,只能夠用crontab -e 來編輯。cron啓動後每過一份鍾讀一次這個文件,檢查是否要執行裏面的命令。所以此文件修改後不須要從新啓動cron服務。
2.編輯/etc/crontab 文件配置cron
cron 服務每分鐘不只要讀一次/var/spool/cron內的全部文件,還須要讀一次/etc/crontab,所以咱們配置這個文件也能運用cron服務作一些事情。用crontab配置是針對某個用戶的,而編輯/etc/crontab是針對系統的任務。此文件的文件格式是:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //若是出現錯誤,或者有數據輸出,數據做爲郵件發給這個賬號
HOME=/ //使用者運行的路徑,這裏是根目錄
# run-parts
01 * * * * root run-parts /etc/cron.hourly //每小時執行/etc/cron.hourly內的腳本
02 4 * * * root run-parts /etc/cron.daily //天天執行/etc/cron.daily內的腳本
22 4 * * 0 root run-parts /etc/cron.weekly //每星期執行/etc/cron.weekly內的腳本
42 4 1 * * root run-parts /etc/cron.monthly //每個月去執行/etc/cron.monthly內的腳本
你們注意"run-parts"這個參數了,若是去掉這個參數的話,後面就能夠寫要運行的某個腳本名,而不是文件夾名了。5,15,25,35,45,55 16,17,18 * * * command這就是表示任意天任意月,其實就是天天的下午4點、5點、6點的5 min、15 min、25 min、35 min、45 min、55 min時執行命令。[例] 在每週一,三,五的下午3:00系統進入維護狀態,從新啓動系統。那麼在crontab 文件中就應該寫入以下字段:00 15 * * 1,3,5 shutdown -r +5而後將該文件存盤爲foxy.cron,再鍵入crontab foxy.cron安裝該文件。[例] 每小時的10分,40分執行用戶目錄下的innd/bbslin這個指令:10,40 * * * * innd/bbslink[例] 每小時的1分執行用戶目錄下的bin/account這個指令:1 * * * * bin/account[例] 天天早晨三點二十分執行用戶目錄下以下所示的兩個指令(每一個指令以;分隔):20 3 * * * (/bin/rm -f expire.ls logins.bad;bin/expire$#@62;expire.1st)[例] 每一年的一月和四月,4號到9號的3點12分和3點55分執行/bin/rm -f expire.1st這個指令,並把結果添加在mm.txt這個文件以後(mm.txt文件位於用戶本身的目錄位置)。12,55 3 4-9 1,4 * /bin/rm -f expire.1st$#@62;$#@62;mm.txt[例] 咱們來看一個超級用戶的crontab文件:#Run the ‘atrun’ program every minutes#This runs anything that’s due to run from ‘at’.See man ‘at’ or ‘atrun’.0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/lib/atrun40 7 * * * updatedb8,10,22,30,39,46,54,58 * * * * /bin/sync