引用位址:http://free.yes81.net/yes81/view-1179.html
crontab 指令
功能是在一定的時間間隔排程一些指令的執行。在 /etc 目錄下有一個 crontab 檔案,這裡存放有系統運作的一些排程程式。每個使用者可以建立自己的排程 crontab 。
crontab 指令有三種形式的指令行結構:
crontab [-u user] [file]
crontab [-u user] [-e|-l|-r]
crontab -l -u [-e|-l|-r]
第一個指令行中, file 是指令檔案的名字。如果在指令行中指定了這個檔案,那麼執行 crontab 指令,則将這個檔案拷貝到 crontabs 目錄下;如果在指令行中沒有制定這個檔案, crontab 指令将接受标準輸入(鍵盤)上鍵入的指令,并将他們也存放在 crontab 目錄下。
指令行中 -r 選項的作用是從 /usr/spool/cron/crontabs 目錄下删除使用者定義的檔案 crontab ;
指令行中 -l 選項的作用是顯示使用者 crontab 檔案的内容。
使用指令 crontab -u user -e 指令編輯使用者 user 的 cron(c) 作業。使用者通過編輯檔案來增加或修改任何作業請求。
執行指令 crontab -u user -r 即可删除目前使用者的所有的 cron 作業。
作業與它們預定的時間儲存在檔案 /usr/spool/cron/crontabs/username 裡。 username 使使用者名,在相應的檔案中存放着該使用者所要運作的指令。指令執行的結果,無論是标準輸出還是錯誤輸出,都将以郵件形式發給使用者。檔案裡的每一個請求必須包含以 spaces 和 tabs 分割的六個域。前五個字段可以取整數值,指定何時開始工作,第六個域是字元串,稱為指令字段,其中包括了 crontab 排程執行的指令。
第一道第五個字段的整數取值範圍及意義是:
0 ~ 59 表示分
1 ~ 23 表示小時
1 ~ 31 表示日
1 ~ 12 表示月份
0 ~ 6 表示星期(其中 0 表示星期日)
/usr/lib/cron/cron.allow 表示誰能使用 crontab 指令。如果它是一個空檔案表明沒有一個使用者能安排作業。如果這個檔案不存在,而有另外一個檔案 /usr/lib/cron/cron.deny, 則隻有不包括在這個檔案中的使用者才可以使用 crontab 指令。如果它是一個空檔案表明任何使用者都可安排作業。兩個檔案同時存在時 cron.allow 優先,如果都不存在,隻有超級使用者可以安排作業。
任務排程的 crond 常駐指令
crond 是 linux 用來定期執行程式的指令。當安裝完成作業系統之後,預設便會啟動此任務排程指令。 crond 指令每分锺會定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作。而 linux 任務排程的工作主要分為以下兩類:
1 、系統執行的工作:系統周期性所要執行的工作,如備份系統資料、清理緩存
2 、個人執行的工作:某個使用者定期要做的工作,例如每隔 10 分鐘檢查郵件伺服器是否有新信,這些工作可由每個使用者自行設定。
一、任務排程設定檔案的寫法
其格式如下:
Minute Hour Day Month Dayofweek command
分鐘 小時 天 月 天每星期 指令
每個字段代表的含義如下:
Minute 每個小時的第幾分鐘執行該任務
Hour 每天的第幾個小時執行該任務
Day 每月的第幾天執行該任務
Month 每年的第幾個月執行該任務
DayOfWeek 每周的第幾天執行該任務
Command 指定要執行的程式
在這些字段裡,除了“ Command ”是每次都必須指定的字段以外,其它字段皆為可選字段,可視需要決定。對于不指定的字段,要用“ * ”來填補其位置。
舉例如下:
1 、指定每小時的第 5 分鐘執行一次 ls 指令
5 * * * * ls
2 、指定每天的 5:30 執行 ls 指令
30 5 * * * ls
3 、指定每月 8 号的 7 : 30 分執行 ls 指令
30 7 8 * * ls
4 、指定每年的 6 月 8 日 5 : 30 執行 ls 指令
30 5 8 6 * ls
5 、指定每星期日的 6:30 執行 ls 指令
30 6 * * 0 ls
注: 0 表示星期天, 1 表示星期 1 ,以此類推,也可以用英文來表示, sun 表示星期天, mon 表示星期一等。
6 、每月 10 号及 20 号的 3 : 30 執行 ls 指令
30 3 10,20 * * ls
注:“,”用來連接配接多個不連續的時段
7 、每天 8-11 點的第 25 分鐘執行 ls 指令
25 8-11 * * * ls
注:“ - ”用來連接配接連續的時段
8 、每 15 分鐘執行一次 ls 指令
*/15 * * * * ls
即每個小時的第 0 15 30 45 60 分鐘執行 ls 指令
9 、每個月中,每隔 10 天 6:30 執行一次 ls 指令
30 6 */10 * * ls
即每月的 1 、 11 、 21 、 31 日是的 6 : 30 執行一次 ls 指令。
10 、每天 7 : 50 以 root 身份執行 /etc/cron.daily 目錄中的所有可執行檔案
50 7 * * * root run-parts /etc/cron.daily
注: run-parts 參數表示,執行後面目錄中的所有可執行檔案。
二、新增排程任務
新增排程任務可用兩種方法:
1 、在指令行輸入 : crontab -e 然後添加相應的任務, wq 存盤退出。
2 、直接編輯 /etc/crontab 檔案,即 vi /etc/crontab ,添加相應的任務。
三、檢視排程任務
crontab -l // 列出目前的所有排程任務
crontab -l -u jp // 列出使用者 jp 的所有排程任務
四、删除任務排程工作
crontab -r // 删除所有任務排程工作
五、任務排程執行結果的轉向
例 1 :每天 5 : 30 執行 ls 指令,并把結果輸出到 /jp/test 檔案中
30 5 * * * ls >/jp/test 2>&1
注: 2>&1 表示執行結果及錯誤資訊。
編輯 /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" 這個參數了,如果去掉這個參數的話,後面就可以寫要運作的某個腳本名,而不是檔案夾名了
以下轉自鳥哥私房菜
http://linux.vbird.org/linux_basic/0430cron.php#at
單一工作排程的進行就使用 at 這個指令囉!這個指令的運作非常簡單!將 at 加上一個時間即可!基本的語法如下:
|
老實說,這個 at 指令的下達最重要的地方在於『時間』的指定了!鳥哥喜歡使用『 now + ... 』 的方式來定義現在過多少時間再進行工作,但有時也需要定義特定的時間點來進行!底下的範例先看看囉!
|
事實上,當我們使用 at 時會進入一個 at shell 的環境來讓使用者下達工作指令,此時,建議你最好使用絕對路徑來下達你的指令,比較不會有問題喔 !由於指令的下達與 PATH 變數有關, 同時與當時的工作目錄也有關連 (如果有牽涉到檔案的話),是以使用絕對路徑來下達指令,會是比較一勞永逸的方法。 為什麼呢?舉例來說,你在 /tmp 下達『 at now 』然後輸入『 mail root -s "test" < .bashrc 』, 問一下,那個 .bashrc 的檔案會是在哪裡?答案是『 /tmp/.bashrc 』!因為 at 在運作時,會跑到當時下達 at 指令的那個工作目錄 的緣故啊!
有些朋友會希望『我要在某某時刻,在我的終端機顯示出 Hello 的字樣』,然後就在 at 裡面下達這樣的資訊『 echo "Hello" 』。等到時間到了,卻發現沒有任何訊息在螢幕上顯示,這是啥原因啊?這是因為 at 的執行與終端機環境無關,而所有 standard output/standard error output 都會傳送到執行者的 mailbox 去 啦!是以在終端機當然看不到任何資訊。那怎辦?沒關係, 可以透過終端機的裝置來處理!假如你在 tty1 登入,則可以使用『 echo "Hello" > /dev/tty1 』來取代。
Tips: 要注意的是,如果在 at shell 內的指令並沒有任何的訊息輸出,那麼 at 預設不會發 email 給執行者的。 如果你想要讓 at 無論如何都發一封 email 告知你是否執行了指令,那麼可以使用『 at -m 時間格式 』來下達指令喔! at 就會傳送一個訊息給執行者,而不論該指令執行有無訊息輸出了! |
at 有另外一個很棒的優點,那就是『背景執行』的功能了!什麼是背景執行啊?很難瞭解嗎?其實與 bash 的 nohup (第十七章 ) 類似啦! 鳥哥提我自己的幾個例子來給您聽聽,您就瞭了!
- 離線繼續工作的任務 :鳥哥初次接觸 Unix 為的是要跑空氣品質模式, 那是一種大型的程式,這個程式在當時的硬體底下跑,一個案例要跑 3 天!由於鳥哥也要進行其他研究工作,是以常常使用 Windows 98 來連線到 Unix 工作站跑那個 3 天的案例!結果你也該知道, Windows 98 連開三天而不當機的機率是很低的~@_@~ 而當機時,所有在 Windows 上的連線都會中斷!包括鳥哥在跑的那個程式也中斷了~嗚嗚~明明再三個鐘頭就跑完的程式, 由於當機害我又得跑 3 天!
- 另一個常用的時刻則是例如上面的範例三,由於某個突發狀況導緻你必須要進行某項工作時,這個 at 就很好用啦!
由於 at 工作排程的使用上,系統會將該項 at 工作獨立出你的 bash 環境中, 直接交給系統的 atd 程式來接管,是以,當你下達了 at 的工作之後就可以立刻離線了, 剩下的工作就完全交給 Linux 管理即可 !是以囉,如果有長時間的網路工作時,嘿嘿! 使用 at 可以讓你免除網路斷線後的困擾喔! ^_^