鸟哥的Linux私房菜(基础篇)- 第十六章、例行性工作排程 (crontab)
最近升級(jí)日期:2009/09/11
| 學(xué)習(xí)了基礎(chǔ)篇也一陣子了,你會(huì)發(fā)現(xiàn)到為什么系統(tǒng)常常會(huì)主動(dòng)的進(jìn)行一些任務(wù)?這些任務(wù)到底是誰在配置工作的?如果你想要讓自己設(shè)計(jì)的備份程序可以自動(dòng)的在系統(tǒng)底下運(yùn)行,而不需要手動(dòng)來啟動(dòng)他,又該如何處置?這些例行的工作可能又分為『?jiǎn)我弧还ぷ髋c『循環(huán)』工作,在系統(tǒng)內(nèi)又是哪些服務(wù)在負(fù)責(zé)?還有還有,如果你想要每年在老婆的生日前一天就發(fā)出一封信件提醒自己不要忘記,可以辦的到嗎?嘿嘿!這些種種要如何處理,就看看這一章先! |
1. 什么是例行性工作排程
1.1 Linux 工作排程的種類: at, crontab
1.2 Linux 上常見的例行性工作
2. 僅運(yùn)行一次的工作排程
2.1 atd 的啟動(dòng)與 at 運(yùn)行的方式: /etc/at.deny
2.2 實(shí)際運(yùn)行單一工作排程: at,atq & atrm, batch
3. 循環(huán)運(yùn)行的例行性工作排程
3.1 使用者的配置: /etc/cron.deny, crontab
3.2 系統(tǒng)的配置檔: /etc/crontab
3.3 一些注意事項(xiàng)
4. 可喚醒停機(jī)期間的工作任務(wù)
4.1 什么是 anacron
4.2 anacron 與 /etc/anacrontab
5. 重點(diǎn)回顧
6. 本章習(xí)題
7. 針對(duì)本文的建議:http://phorum.vbird.org/viewtopic.php?t=23889
什么是例行性工作排程
每個(gè)人或多或少都有一些約會(huì)或者是工作,有的工作是例行性的,例如每年一次的加薪、每個(gè)月一次的工作報(bào)告、每周一次的午餐會(huì)報(bào)、每天需要的打卡等等;有的工作則是臨時(shí)發(fā)生的,例如剛好總公司有高官來訪,需要你準(zhǔn)備演講器材等等!用在生活上面,例如每年的愛人的生日、每天的起床時(shí)間等等、還有突發(fā)性的計(jì)算機(jī)大降價(jià) (啊!真希望天天都有!) 等等羅。
像上面這些例行性工作,通常你得要記錄在行事歷上面才能避免忘記!不過,由於我們常常在計(jì)算機(jī)前面的緣故,如果計(jì)算機(jī)系統(tǒng)能夠主動(dòng)的通知我們的話,那么不就輕松多了!嘿嘿!這個(gè)時(shí)候 Linux 的例行性工作排程就可以派上場(chǎng)了!在不考慮硬件與我們服務(wù)器的連結(jié)狀態(tài)下,我們的 Linux 可以幫你提醒很多任務(wù),例如:每一天早上 8:00 鐘要服務(wù)器連接上音響,并啟動(dòng)音樂來喚你起床;而中午12:00 希望 Linux 可以發(fā)一封信到你的郵件信箱,提醒你可以去吃午餐了;另外,在每年的你愛人生日的前一天,先發(fā)封信提醒你,以免忘記這么重要的一天。
那么 Linux 的例行性工作是如何進(jìn)行排程的呢?所謂的排程就是將這些工作安排運(yùn)行的流程之意!咱們的 Linux 排程就是透過 crontab 與 at 這兩個(gè)東西!這兩個(gè)玩意兒有啥異同?就讓我們來瞧瞧先!
Linux 工作排程的種類: at, cron
從上面的說明當(dāng)中,我們可以很清楚的發(fā)現(xiàn)兩種工作排程的方式:
- 一種是例行性的,就是每隔一定的周期要來辦的事項(xiàng);
- 一種是突發(fā)性的,就是這次做完以后就沒有的那一種 (計(jì)算機(jī)大降價(jià)...)
那么在 Linux 底下如何達(dá)到這兩個(gè)功能呢?那就得使用 at 與 crontab 這兩個(gè)好東西羅!
- at :at 是個(gè)可以處理僅運(yùn)行一次就結(jié)束排程的命令,不過要運(yùn)行 at 時(shí),必須要有 atd 這個(gè)服務(wù) (第十八章) 的支持才行。在某些新版的 distributions 中,atd 可能默認(rèn)并沒有啟動(dòng),那么 at 這個(gè)命令就會(huì)失效呢!不過我們的 CentOS 默認(rèn)是啟動(dòng)的!
- crontab :crontab 這個(gè)命令所配置的工作將會(huì)循環(huán)的一直進(jìn)行下去!可循環(huán)的時(shí)間為分鐘、小時(shí)、每周、每月或每年等。crontab 除了可以使用命令運(yùn)行外,亦可編輯 /etc/crontab 來支持。至於讓 crontab 可以生效的服務(wù)則是 crond 這個(gè)服務(wù)喔!
底下我們先來談一談 Linux 的系統(tǒng)到底在做什么事情,怎么有若干多的工作排程在進(jìn)行呢?然后再回來談一談at 與 crontab 這兩個(gè)好東西!
Linux 上常見的例行性工作
如果你曾經(jīng)使用過 Linux 一陣子了,那么你大概會(huì)發(fā)現(xiàn)到 Linux 會(huì)主動(dòng)的幫我們進(jìn)行一些工作呢!比方說自動(dòng)的進(jìn)行線上升級(jí) (on-line update)、自動(dòng)的進(jìn)行 updatedb (第七章談到的 locate 命令) 升級(jí)檔名數(shù)據(jù)庫、自動(dòng)的作登錄檔分析(所以 root 常常會(huì)收到標(biāo)題為 logwatch 的信件) 等等。這是由於系統(tǒng)要正常運(yùn)行的話,某些在背景底下的工作必須要定時(shí)進(jìn)行的緣故。基本上 Linux 系統(tǒng)常見的例行性任務(wù)有:
- 進(jìn)行登錄檔的輪替 (log rotate):
Linux 會(huì)主動(dòng)的將系統(tǒng)所發(fā)生的各種資訊都記錄下來,這就是登錄檔 (第十九章)。由於系統(tǒng)會(huì)一直記錄登錄資訊,所以登錄檔將會(huì)越來越大!我們知道大型文件不但占容量還會(huì)造成讀寫效能的困擾,因此適時(shí)的將登錄檔數(shù)據(jù)挪一挪,讓舊的數(shù)據(jù)與新的數(shù)據(jù)分別存放,則比較可以有效的記錄登錄資訊。這就是 log rotate 的任務(wù)!這也是系統(tǒng)必要的例行任務(wù);
- 登錄檔分析 logwatch 的任務(wù):
如果系統(tǒng)發(fā)生了軟件問題、硬件錯(cuò)誤、資安問題等,絕大部分的錯(cuò)誤資訊都會(huì)被記錄到登錄檔中,因此系統(tǒng)管理員的重要任務(wù)之一就是分析登錄檔。但你不可能手動(dòng)透過 vim 等軟件去檢視登錄檔,因?yàn)閿?shù)據(jù)太復(fù)雜了!我們的 CentOS 提供了一只程序『 logwatch 』來主動(dòng)分析登錄資訊,所以你會(huì)發(fā)現(xiàn),你的 root 老是會(huì)收到標(biāo)題為 logwatch的信件,那是正常的!你最好也能夠看看該信件的內(nèi)容喔!
- 創(chuàng)建 locate 的數(shù)據(jù)庫:
在第七章我們談到的 locate 命令時(shí),我們知道該命令是透過已經(jīng)存在的檔名數(shù)據(jù)庫來進(jìn)行系統(tǒng)上檔名的查詢。我們的檔名數(shù)據(jù)庫是放置到 /var/lib/mlocate/ 中。問題是,這個(gè)數(shù)據(jù)庫怎么會(huì)自動(dòng)升級(jí)啊?嘿嘿!這就是系統(tǒng)的例行性工作所產(chǎn)生的效果啦!系統(tǒng)會(huì)主動(dòng)的進(jìn)行updatedb 喔!
- whatis 數(shù)據(jù)庫的創(chuàng)建:
與 locate 數(shù)據(jù)庫類似的,whatis 也是個(gè)數(shù)據(jù)庫,這個(gè) whatis 是與man page 有關(guān)的一個(gè)查詢命令,不過要使用 whatis 命令時(shí),必須要擁有 whatis 數(shù)據(jù)庫,而這個(gè)數(shù)據(jù)庫也是透過系統(tǒng)的例行性工作排程來自動(dòng)運(yùn)行的哩!
- RPM 軟件登錄檔的創(chuàng)建:
RPM (第二十三章) 是一種軟件管理的機(jī)制。由於系統(tǒng)可能會(huì)常常變更軟件,包括軟件的新安裝、非經(jīng)常性升級(jí)等,都會(huì)造成軟件檔名的差異。為了方便未來追蹤,系統(tǒng)也幫我們將檔名作個(gè)排序的記錄呢!有時(shí)候系統(tǒng)也會(huì)透過排程來幫忙 RPM 數(shù)據(jù)庫的重新建置喔!
- 移除緩存檔:
某些軟件在運(yùn)行中會(huì)產(chǎn)生一些緩存檔,但是當(dāng)這個(gè)軟件關(guān)閉時(shí),這些緩存檔可能并不會(huì)主動(dòng)的被移除。有些緩存檔則有時(shí)間性,如果超過一段時(shí)間后,這個(gè)緩存檔就沒有效用了,此時(shí)移除這些緩存檔就是一件重要的工作!否則磁碟容量會(huì)被耗光。系統(tǒng)透過例行性工作排程運(yùn)行名為 tmpwatch 的命令來刪除這些緩存檔呢!
- 與網(wǎng)絡(luò)服務(wù)有關(guān)的分析行為:
如果你有安裝類似 WWW 服務(wù)器軟件 (一個(gè)名為 apache 的軟件),那么你的 Linux 系統(tǒng)通常就會(huì)主動(dòng)的分析該軟件的登錄檔。同時(shí)某些憑證與認(rèn)證的網(wǎng)絡(luò)資訊是否過期的問題,我們的 Linux 系統(tǒng)也會(huì)很親和的幫你進(jìn)行自動(dòng)檢查!
其實(shí)你的系統(tǒng)會(huì)進(jìn)行的例行性工作與你安裝的軟件多寡有關(guān),如果你安裝過多的軟件,某些服務(wù)功能的軟件都會(huì)附上分析工具,那么你的系統(tǒng)就會(huì)多出一些例行性工作羅!像鳥哥的主機(jī)還多加了很多自己撰寫的分析工具,以及其他第三方協(xié)力軟件的分析軟件,嘿嘿!俺的 Linux 工作量可是非常大的哩!因?yàn)橛羞@么多的工作需要進(jìn)行,所以我們當(dāng)然得要了解例行性工作的處理方式羅!
僅運(yùn)行一次的工作排程
首先,我們先來談?wù)剢我还ぷ髋懦痰倪\(yùn)行,那就是 at 這個(gè)命令的運(yùn)行!
atd 的啟動(dòng)與 at 運(yùn)行的方式
要使用單一工作排程時(shí),我們的 Linux 系統(tǒng)上面必須要有負(fù)責(zé)這個(gè)排程的服務(wù),那就是 atd 這個(gè)玩意兒。不過并非所有的 Linux distributions 都默認(rèn)會(huì)把他打開的,所以呢,某些時(shí)刻我們必須要手動(dòng)將他激活才行。激活的方法很簡(jiǎn)單,就是這樣:
| [root@www ~]# /etc/init.d/atd restart 正在停止 atd: [ 確定 ] 正在啟動(dòng) atd: [ 確定 ]# 再配置一下啟動(dòng)時(shí)就啟動(dòng)這個(gè)服務(wù),免得每次重新啟動(dòng)都得再來一次! [root@www ~]# chkconfig atd on |
重點(diǎn)是那個(gè)『正在啟動(dòng)(或 starting)』項(xiàng)目的 OK 啦!那表示啟動(dòng)是正常的!這部份我們?cè)诘谑苏聲?huì)談及。如果您真的有興趣,那么可以自行到 /etc/init.d/atd 這個(gè) shell script 內(nèi)去瞧一瞧先! ^_^。至於那個(gè) chkconfig ,你也可以使用 man 先查閱一下啊!我們第十八章再介紹啦!
- at 的運(yùn)行方式
既然是工作排程,那么應(yīng)該會(huì)有產(chǎn)生工作的方式,并且將這些工作排進(jìn)行程表中羅!OK!那么產(chǎn)生工作的方式是怎么進(jìn)行的?事實(shí)上,我們使用 at 這個(gè)命令來產(chǎn)生所要運(yùn)行的工作,并將這個(gè)工作以文字檔的方式寫入/var/spool/at/ 目錄內(nèi),該工作便能等待 atd 這個(gè)服務(wù)的取用與運(yùn)行了。就這么簡(jiǎn)單。
不過,并不是所有的人都可以進(jìn)行 at 工作排程喔!為什么?因?yàn)榘踩睦碛砂?#xff5e;很多主機(jī)被所謂的『綁架』后,最常發(fā)現(xiàn)的就是他們的系統(tǒng)當(dāng)中多了很多的怪客程序 (cracker program),這些程序非常可能運(yùn)用工作排程來運(yùn)行或搜集系統(tǒng)資訊,并定時(shí)的回報(bào)給怪客團(tuán)體!所以羅,除非是你認(rèn)可的帳號(hào),否則先不要讓他們使用 at 吧!那怎么達(dá)到使用 at 的列管呢?
我們可以利用 /etc/at.allow 與 /etc/at.deny 這兩個(gè)文件來進(jìn)行 at 的使用限制呢!加上這兩個(gè)文件后, at 的工作情況其實(shí)是這樣的:
透過這個(gè)說明,我們知道 /etc/at.allow 是管理較為嚴(yán)格的方式,而 /etc/at.deny 則較為松散 (因?yàn)閹ぬ?hào)沒有在該文件中,就能夠運(yùn)行 at 了)。在一般的 distributions 當(dāng)中,由於假設(shè)系統(tǒng)上的所有用戶都是可信任的,因此系統(tǒng)通常會(huì)保留一個(gè)空的 /etc/at.deny 文件,意思是允許所有人使用 at 命令的意思 (您可以自行檢查一下該文件)。不過,萬一你不希望有某些使用者使用 at 的話,將那個(gè)使用者的帳號(hào)寫入 /etc/at.deny 即可!一個(gè)帳號(hào)寫一行。
實(shí)際運(yùn)行單一工作排程
單一工作排程的進(jìn)行就使用 at 這個(gè)命令羅!這個(gè)命令的運(yùn)行非常簡(jiǎn)單!將 at 加上一個(gè)時(shí)間即可!基本的語法如下:
| [root@www ~]# at [-mldv] TIME [root@www ~]# at -c 工作號(hào)碼 選項(xiàng)與參數(shù): -m :當(dāng) at 的工作完成后,即使沒有輸出信息,亦以 email 通知使用者該工作已完成。 -l :at -l 相當(dāng)於 atq,列出目前系統(tǒng)上面的所有該使用者的 at 排程; -d :at -d 相當(dāng)於 atrm ,可以取消一個(gè)在 at 排程中的工作; -v :可以使用較明顯的時(shí)間格式列出 at 排程中的工作列表; -c :可以列出后面接的該項(xiàng)工作的實(shí)際命令內(nèi)容。TIME:時(shí)間格式,這里可以定義出『什么時(shí)候要進(jìn)行 at 這項(xiàng)工作』的時(shí)間,格式有:HH:MM ex> 04:00在今日的 HH:MM 時(shí)刻進(jìn)行,若該時(shí)刻已超過,則明天的 HH:MM 進(jìn)行此工作。HH:MM YYYY-MM-DD ex> 04:00 2009-03-17強(qiáng)制規(guī)定在某年某月的某一天的特殊時(shí)刻進(jìn)行該工作!HH:MM[am|pm] [Month] [Date] ex> 04pm March 17也是一樣,強(qiáng)制在某年某月某日的某時(shí)刻進(jìn)行!HH:MM[am|pm] + number [minutes|hours|days|weeks]ex> now + 5 minutes ex> 04pm + 3 days就是說,在某個(gè)時(shí)間點(diǎn)『再加幾個(gè)時(shí)間后』才進(jìn)行。 |
老實(shí)說,這個(gè) at 命令的下達(dá)最重要的地方在於『時(shí)間』的指定了!鳥哥喜歡使用『 now + ... 』的方式來定義現(xiàn)在過多少時(shí)間再進(jìn)行工作,但有時(shí)也需要定義特定的時(shí)間點(diǎn)來進(jìn)行!底下的范例先看看羅!
| 范例一:再過五分鐘后,將 /root/.bashrc 寄給 root 自己 [root@www ~]# at now + 5 minutes <==記得單位要加 s 喔! at> /bin/mail root -s "testing at job" < /root/.bashrc at> <EOT> <==這里輸入 [ctrl] + d 就會(huì)出現(xiàn) <EOF> 的字樣!代表結(jié)束! job 4 at 2009-03-14 15:38 # 上面這行資訊在說明,第 4 個(gè) at 工作將在 2009/03/14 的 15:38 進(jìn)行! # 而運(yùn)行 at 會(huì)進(jìn)入所謂的 at shell 環(huán)境,讓你下達(dá)多重命令等待運(yùn)行!范例二:將上述的第 4 項(xiàng)工作內(nèi)容列出來查閱 [root@www ~]# at -c 4 #!/bin/sh <==就是透過 bash shell 的啦! # atrun uid=0 gid=0 # mail root 0 umask 22 ....(中間省略許多的環(huán)境變量項(xiàng)目).... cd /root || { <==可以看出,會(huì)到下達(dá) at 時(shí)的工作目錄去運(yùn)行命令echo 'Execution directory inaccessible' >&2exit 1 }/bin/mail root -s "testing at job" < /root/.bashrc # 你可以看到命令運(yùn)行的目錄 (/root),還有多個(gè)環(huán)境變量與實(shí)際的命令內(nèi)容啦!范例三:由於機(jī)房預(yù)計(jì)於 2009/03/18 停電,我想要在 2009/03/17 23:00 關(guān)機(jī)? [root@www ~]# at 23:00 2009-03-17 at> /bin/sync at> /bin/sync at> /sbin/shutdown -h now at> <EOT> job 5 at 2009-03-17 23:00 # 您瞧瞧! at 還可以在一個(gè)工作內(nèi)輸入多個(gè)命令呢!不錯(cuò)吧! |
事實(shí)上,當(dāng)我們使用 at 時(shí)會(huì)進(jìn)入一個(gè) at shell 的環(huán)境來讓使用者下達(dá)工作命令,此時(shí),建議你最好使用絕對(duì)路徑來下達(dá)你的命令,比較不會(huì)有問題喔!由於命令的下達(dá)與 PATH 變量有關(guān),同時(shí)與當(dāng)時(shí)的工作目錄也有關(guān)連 (如果有牽涉到文件的話),因此使用絕對(duì)路徑來下達(dá)命令,會(huì)是比較一勞永逸的方法。為什么呢?舉例來說,你在 /tmp 下達(dá)『 at now 』然后輸入『 mail root -s "test" < .bashrc 』,問一下,那個(gè) .bashrc 的文件會(huì)是在哪里?答案是『 /tmp/.bashrc 』!因?yàn)?span id="ozvdkddzhkzd" class="text_import2">at 在運(yùn)行時(shí),會(huì)跑到當(dāng)時(shí)下達(dá) at 命令的那個(gè)工作目錄的緣故啊!
有些朋友會(huì)希望『我要在某某時(shí)刻,在我的終端機(jī)顯示出 Hello 的字樣』,然后就在 at 里面下達(dá)這樣的資訊『echo "Hello" 』。等到時(shí)間到了,卻發(fā)現(xiàn)沒有任何信息在螢?zāi)簧巷@示,這是啥原因啊?這是因?yàn)?at 的運(yùn)行與終端機(jī)環(huán)境無關(guān),而所有 standard output/standard error output都會(huì)傳送到運(yùn)行者的 mailbox 去啦!所以在終端機(jī)當(dāng)然看不到任何資訊。那怎辦?沒關(guān)系,可以透過終端機(jī)的裝置來處理!假如你在 tty1 登陸,則可以使用『 echo "Hello" > /dev/tty1 』來取代。
| Tips: 要注意的是,如果在 at shell 內(nèi)的命令并沒有任何的信息輸出,那么 at 默認(rèn)不會(huì)發(fā) email 給運(yùn)行者的。如果你想要讓 at 無論如何都發(fā)一封 email 告知你是否運(yùn)行了命令,那么可以使用『 at -m 時(shí)間格式 』來下達(dá)命令喔!at 就會(huì)傳送一個(gè)信息給運(yùn)行者,而不論該命令運(yùn)行有無信息輸出了! |
at 有另外一個(gè)很棒的優(yōu)點(diǎn),那就是『背景運(yùn)行』的功能了!什么是背景運(yùn)行啊?很難了解嗎?其實(shí)與 bash 的 nohup (第十七章) 類似啦!鳥哥提我自己的幾個(gè)例子來給您聽聽,您就了了!
- 離線繼續(xù)工作的任務(wù):鳥哥初次接觸 Unix 為的是要跑空氣品質(zhì)模式,那是一種大型的程序,這個(gè)程序在當(dāng)時(shí)的硬件底下跑,一個(gè)案例要跑 3 天!由於鳥哥也要進(jìn)行其他研究工作,因此常常使用 Windows98 來連線到 Unix 工作站跑那個(gè) 3 天的案例!結(jié)果你也該知道, Windows 98 連開三天而不死機(jī)的機(jī)率是很低的~@_@~而死機(jī)時(shí),所有在 Windows 上的連線都會(huì)中斷!包括鳥哥在跑的那個(gè)程序也中斷了~嗚嗚~明明再三個(gè)鐘頭就跑完的程序,由於死機(jī)害我又得跑 3 天!
- 另一個(gè)常用的時(shí)刻則是例如上面的范例三,由於某個(gè)突發(fā)狀況導(dǎo)致你必須要進(jìn)行某項(xiàng)工作時(shí),這個(gè) at 就很好用啦!
由於 at 工作排程的使用上,系統(tǒng)會(huì)將該項(xiàng) at 工作獨(dú)立出你的 bash 環(huán)境中,直接交給系統(tǒng)的 atd 程序來接管,因此,當(dāng)你下達(dá)了 at 的工作之后就可以立刻離線了,剩下的工作就完全交給 Linux 管理即可!所以羅,如果有長時(shí)間的網(wǎng)絡(luò)工作時(shí),嘿嘿!使用 at 可以讓你免除網(wǎng)絡(luò)斷線后的困擾喔! ^_^
- at 工作的管理
那么萬一我下達(dá)了 at 之后,才發(fā)現(xiàn)命令輸入錯(cuò)誤,該如何是好?就將他移除啊!利用 atq 與 atrm 吧!
| [root@www ~]# atq [root@www ~]# atrm (jobnumber)范例一:查詢目前主機(jī)上面有多少的 at 工作排程? [root@www ~]# atq 5 2009-03-17 23:00 a root # 上面說的是:『在 2009/03/17 的 23:00 有一項(xiàng)工作,該項(xiàng)工作命令下達(dá)者為 # root』而且,該項(xiàng)工作的工作號(hào)碼 (jobnumber) 為 5 號(hào)喔!范例二:將上述的第 5 個(gè)工作移除! [root@www ~]# atrm 5 [root@www ~]# atq # 沒有任何資訊,表示該工作被移除了! |
如此一來,你可以利用 atq 來查詢,利用 atrm 來刪除錯(cuò)誤的命令,利用 at 來直接下達(dá)單一工作排程!很簡(jiǎn)單吧!不過,有個(gè)問題需要處理一下。如果你是在一個(gè)非常忙碌的系統(tǒng)下運(yùn)行 at ,能不能指定你的工作在系統(tǒng)較閑的時(shí)候才進(jìn)行呢?可以的,那就使用 batch 命令吧!
- batch:系統(tǒng)有空時(shí)才進(jìn)行背景任務(wù)
其實(shí) batch 是利用 at 來進(jìn)行命令的下達(dá)啦!只是加入一些控制參數(shù)而已。這個(gè) batch 神奇的地方在於:他會(huì)在 CPU 工作負(fù)載小於 0.8 的時(shí)候,才進(jìn)行你所下達(dá)的工作任務(wù)啦!那什么是負(fù)載 0.8 呢?這個(gè)負(fù)載的意思是: CPU 在單一時(shí)間點(diǎn)所負(fù)責(zé)的工作數(shù)量。不是 CPU 的使用率喔!舉例來說,如果我有一只程序他需要一直使用 CPU 的運(yùn)算功能,那么此時(shí) CPU 的使用率可能到達(dá) 100% ,但是 CPU 的工作負(fù)載則是趨近於『 1 』,因?yàn)?CPU 僅負(fù)責(zé)一個(gè)工作嘛!如果同時(shí)運(yùn)行這樣的程序兩支呢?CPU 的使用率還是 100% ,但是工作負(fù)載則變成 2 了!了解乎?
所以也就是說,當(dāng) CPU 的工作負(fù)載越大,代表 CPU 必須要在不同的工作之間進(jìn)行頻繁的工作切換。這樣的 CPU 運(yùn)行情況我們?cè)诘诹阏掠姓勥^,忘記的話請(qǐng)回去瞧瞧!因?yàn)橐恢鼻袚Q工作,所以會(huì)導(dǎo)致系統(tǒng)忙碌啊!系統(tǒng)如果很忙碌,還要額外進(jìn)行 at ,不太合理!所以才有 batch 命令的產(chǎn)生!
那么 batch 如何下達(dá)命令呢?很簡(jiǎn)單啊!與 at 相同啦!例如下面的范例:
| 范例一:同樣是機(jī)房停電在 2009/3/17 23:00 關(guān)機(jī),但若當(dāng)時(shí)系統(tǒng)負(fù)載太高,則暫緩運(yùn)行 [root@www ~]# batch 23:00 2009-3-17 at> sync at> sync at> shutdown -h now at> <EOT> job 6 at 2009-03-17 23:00[root@www ~]# atq 6 2009-03-17 23:00 b root [root@www ~]# atrm 6 |
你會(huì)發(fā)現(xiàn)其實(shí) batch 也是使用 atq/atrm 來管理的!這樣了解乎?
循環(huán)運(yùn)行的例行性工作排程
相對(duì)於 at 是僅運(yùn)行一次的工作,循環(huán)運(yùn)行的例行性工作排程則是由 cron (crond)這個(gè)系統(tǒng)服務(wù)來控制的。剛剛談過 Linux 系統(tǒng)上面原本就有非常多的例行性工作,因此這個(gè)系統(tǒng)服務(wù)是默認(rèn)啟動(dòng)的。另外,由於使用者自己也可以進(jìn)行例行性工作排程,所以羅, Linux 也提供使用者控制例行性工作排程的命令 (crontab)。底下我們分別來聊一聊羅!
使用者的配置
使用者想要?jiǎng)?chuàng)建循環(huán)型工作排程時(shí),使用的是 crontab 這個(gè)命令啦~不過,為了安全性的問題,與 at 同樣的,我們可以限制使用 crontab 的使用者帳號(hào)喔!使用的限制數(shù)據(jù)有:
- /etc/cron.allow:
將可以使用 crontab 的帳號(hào)寫入其中,若不在這個(gè)文件內(nèi)的使用者則不可使用 crontab;
- /etc/cron.deny:
將不可以使用 crontab 的帳號(hào)寫入其中,若未記錄到這個(gè)文件當(dāng)中的使用者,就可以使用 crontab 。
與 at 很像吧!同樣的,以優(yōu)先順序來說, /etc/cron.allow 比 /etc/cron.deny 要優(yōu)先,而判斷上面,這兩個(gè)文件只選擇一個(gè)來限制而已,因此,建議你只要保留一個(gè)即可,免得影響自己在配置上面的判斷!一般來說,系統(tǒng)默認(rèn)是保留 /etc/cron.deny ,你可以將不想讓他運(yùn)行 crontab 的那個(gè)使用者寫入 /etc/cron.deny 當(dāng)中,一個(gè)帳號(hào)一行!
當(dāng)使用者使用 crontab 這個(gè)命令來創(chuàng)建工作排程之后,該項(xiàng)工作就會(huì)被紀(jì)錄到 /var/spool/cron/ 里面去了,而且是以帳號(hào)來作為判別的喔!舉例來說, dmtsai 使用 crontab 后,他的工作會(huì)被紀(jì)錄到 /var/spool/cron/dmtsai 里頭去!但請(qǐng)注意,不要使用 vi 直接編輯該文件,因?yàn)榭赡苡伸遁斎胝Z法錯(cuò)誤,會(huì)導(dǎo)致無法運(yùn)行 cron 喔!另外, cron 運(yùn)行的每一項(xiàng)工作都會(huì)被紀(jì)錄到/var/log/cron 這個(gè)登錄檔中,所以羅,如果你的 Linux 不知道有否被植入木馬時(shí),也可以搜尋一下 /var/log/cron 這個(gè)登錄檔呢!
好了,那么我們就來聊一聊 crontab 的語法吧!
| [root@www ~]# crontab [-u username] [-l|-e|-r] 選項(xiàng)與參數(shù): -u :只有 root 才能進(jìn)行這個(gè)任務(wù),亦即幫其他使用者創(chuàng)建/移除 crontab 工作排程; -e :編輯 crontab 的工作內(nèi)容 -l :查閱 crontab 的工作內(nèi)容 -r :移除所有的 crontab 的工作內(nèi)容,若僅要移除一項(xiàng),請(qǐng)用 -e 去編輯。范例一:用 dmtsai 的身份在每天的 12:00 發(fā)信給自己 [dmtsai@www ~]$ crontab -e # 此時(shí)會(huì)進(jìn)入 vi 的編輯畫面讓您編輯工作!注意到,每項(xiàng)工作都是一行。 0 12 * * * mail dmtsai -s "at 12:00" < /home/dmtsai/.bashrc #分 時(shí) 日 月 周 |<==============命令串========================>| |
默認(rèn)情況下,任何使用者只要不被列入 /etc/cron.deny 當(dāng)中,那么他就可以直接下達(dá)『 crontab -e 』去編輯自己的例行性命令了!整個(gè)過程就如同上面提到的,會(huì)進(jìn)入 vi 的編輯畫面,然后以一個(gè)工作一行來編輯,編輯完畢之后輸入『 :wq 』儲(chǔ)存后離開 vi 就可以了!而每項(xiàng)工作 (每行) 的格式都是具有六個(gè)欄位,這六個(gè)欄位的意義為:
| 代表意義 | 分鐘 | 小時(shí) | 日期 | 月份 | 周 | 命令 |
| 數(shù)字范圍 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 | 呀就命令啊 |
比較有趣的是那個(gè)『周』喔!周的數(shù)字為 0 或 7 時(shí),都代表『星期天』的意思!另外,還有一些輔助的字符,大概有底下這些:
| 特殊字符 | 代表意義 |
| *(星號(hào)) | 代表任何時(shí)刻都接受的意思!舉例來說,范例一內(nèi)那個(gè)日、月、周都是 * ,就代表著『不論何月、何日的禮拜幾的 12:00 都運(yùn)行后續(xù)命令』的意思! |
| ,(逗號(hào)) | 代表分隔時(shí)段的意思。舉例來說,如果要下達(dá)的工作是 3:00 與 6:00 時(shí),就會(huì)是: 0 3,6 * * * command 時(shí)間參數(shù)還是有五欄,不過第二欄是 3,6 ,代表 3 與 6 都適用! |
| -(減號(hào)) | 代表一段時(shí)間范圍內(nèi),舉例來說, 8 點(diǎn)到 12 點(diǎn)之間的每小時(shí)的 20 分都進(jìn)行一項(xiàng)工作: 20 8-12 * * * command 仔細(xì)看到第二欄變成 8-12 喔!代表 8,9,10,11,12 都適用的意思! |
| /n(斜線) | 那個(gè) n 代表數(shù)字,亦即是『每隔 n 單位間隔』的意思,例如每五分鐘進(jìn)行一次,則: */5 * * * * command 很簡(jiǎn)單吧!用 * 與 /5 來搭配,也可以寫成 0-59/5 ,相同意思! |
我們就來搭配幾個(gè)例子練習(xí)看看吧!底下的案例請(qǐng)實(shí)際用 dmtsai 這個(gè)身份作看看喔!后續(xù)的動(dòng)作才能夠搭配起來!
| 例題: 假若你的女朋友生日是 5 月 2 日,你想要在 5 月 1 日的 23:59 發(fā)一封信給他,這封信的內(nèi)容已經(jīng)寫在/home/dmtsai/lover.txt 內(nèi)了,該如何進(jìn)行? 答: 直接下達(dá) crontab -e 之后,編輯成為: 59 23 1 5 * mail kiki < /home/dmtsai/lover.txt 那樣的話,每年 kiki 都會(huì)收到你的這封信喔!(當(dāng)然羅,信的內(nèi)容就要每年變一變啦!) |
| 例題: 假如每五分鐘需要運(yùn)行 /home/dmtsai/test.sh 一次,又該如何? 答: 同樣使用 crontab -e 進(jìn)入編輯: */5 * * * * /home/dmtsai/test.sh |
那個(gè) crontab 每個(gè)人都只有一個(gè)文件存在,就是在 /var/spool/cron 里面啊!還有建議您:『命令下達(dá)時(shí),最好使用絕對(duì)路徑,這樣比較不會(huì)找不到運(yùn)行檔喔!』
| 例題: 假如你每星期六都與朋友有約,那么想要每個(gè)星期五下午 4:30 告訴你朋友星期六的約會(huì)不要忘記,則: 答: 還是使用 crontab -e 啊! 30 16 * * 5 mail friend@his.server.name < /home/dmtsai/friend.txt |
真的是很簡(jiǎn)單吧!呵呵!那么,該如何查詢使用者目前的 crontab 內(nèi)容呢?我們可以這樣來看看:
| [dmtsai@www ~]$ crontab -l 59 23 1 5 * mail kiki < /home/dmtsai/lover.txt */5 * * * * /home/dmtsai/test.sh 30 16 * * 5 mail friend@his.server.name < /home/dmtsai/friend.txt# 注意,若僅想要移除一項(xiàng)工作而已的話,必須要用 crontab -e 去編輯~ # 如果想要全部的工作都移除,才使用 crontab -r 喔! [dmtsai@www ~]$ crontab -r [dmtsai@www ~]$ crontab -l no crontab for dmtsai |
看到了嗎? crontab 『整個(gè)內(nèi)容都不見了!』所以請(qǐng)注意:『如果只是要?jiǎng)h除某個(gè) crontab 的工作項(xiàng)目,那么請(qǐng)使用 crontab -e 來重新編輯即可!』如果使用 -r 的參數(shù),是會(huì)將所有的 crontab 數(shù)據(jù)內(nèi)容都刪掉的!千萬注意了!
系統(tǒng)的配置檔: /etc/crontab
這個(gè)『 crontab -e 』是針對(duì)使用者的 cron 來設(shè)計(jì)的,如果是『系統(tǒng)的例行性任務(wù)』時(shí),該怎么辦呢?是否還是需要以 crontab -e 來管理你的例行性工作排程呢?當(dāng)然不需要,你只要編輯/etc/crontab 這個(gè)文件就可以啦!有一點(diǎn)需要特別注意喔!那就是crontab -e 這個(gè) crontab 其實(shí)是 /usr/bin/crontab 這個(gè)運(yùn)行檔,但是 /etc/crontab可是一個(gè)『純文字檔』喔!你可以 root 的身份編輯一下這個(gè)文件哩!
基本上, cron 這個(gè)服務(wù)的最低偵測(cè)限制是『分鐘』,所以『 cron會(huì)每分鐘去讀取一次 /etc/crontab 與 /var/spool/cron 里面的數(shù)據(jù)內(nèi)容』,因此,只要你編輯完 /etc/crontab 這個(gè)文件,并且將他儲(chǔ)存之后,那么 cron 的配置就自動(dòng)的會(huì)來運(yùn)行了!
| Tips: 在 Linux 底下的 crontab 會(huì)自動(dòng)的幫我們每分鐘重新讀取一次 /etc/crontab 的例行工作事項(xiàng),但是某些原因或者是其他的 Unix 系統(tǒng)中,由於 crontab 是讀到內(nèi)存當(dāng)中的,所以在你修改完 /etc/crontab 之后,可能并不會(huì)馬上運(yùn)行,這個(gè)時(shí)候請(qǐng)重新啟動(dòng) crond 這個(gè)服務(wù)吧!『/etc/init.d/crond restart』 |
廢話少說,我們就來看一下這個(gè) /etc/crontab 的內(nèi)容吧!
| [root@www ~]# cat /etc/crontab SHELL=/bin/bash <==使用哪種 shell 介面 PATH=/sbin:/bin:/usr/sbin:/usr/bin <==運(yùn)行檔搜尋路徑 MAILTO=root <==若有額外STDOUT,以 email將數(shù)據(jù)送給誰 HOME=/ <==默認(rèn)此 shell 的家目錄所在# run-parts 01 * * * * root run-parts /etc/cron.hourly <==每小時(shí) 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 <==每個(gè)月 1 號(hào) 分 時(shí) 日 月 周 運(yùn)行者身份 命令串 |
看到這個(gè)文件的內(nèi)容你大概就了解了吧!呵呵,沒錯(cuò)!這個(gè)文件與將剛剛我們下達(dá) crontab -e 的內(nèi)容幾乎完全一模一樣!只是有幾個(gè)地方不太相同:
- MAILTO=root:
這個(gè)項(xiàng)目是說,當(dāng) /etc/crontab 這個(gè)文件中的例行性工作的命令發(fā)生錯(cuò)誤時(shí),或者是該工作的運(yùn)行結(jié)果有 STDOUT/STDERR 時(shí),會(huì)將錯(cuò)誤信息或者是螢?zāi)伙@示的信息傳給誰?默認(rèn)當(dāng)然是由系統(tǒng)直接寄發(fā)一封 mail 給 root 啦!不過,由於 root 并無法在用戶端中以 POP3 之類的軟件收信,因此,鳥哥通常都將這個(gè) e-mail 改成自己的帳號(hào),好讓我隨時(shí)了解系統(tǒng)的狀況!例如:MAILTO=dmtsai@my.host.name
- PATH=....:
還記得我們?cè)诘谑徽碌?BASH 當(dāng)中一直提到的運(yùn)行檔路徑問題吧!沒錯(cuò)啦!這里就是輸入運(yùn)行檔的搜尋路徑!使用默認(rèn)的路徑配置就已經(jīng)很足夠了!
- 01 * * * * root run-parts /etc/cron.hourly:
這個(gè) /etc/crontab 里面預(yù)配置義出四項(xiàng)工作任務(wù),分別是每小時(shí)、每天、每周及每個(gè)月分別進(jìn)行一次的工作!但是在五個(gè)欄位后面接的并不是命令,而是一個(gè)新的欄位,那就是『運(yùn)行后面那串命令的身份』為何!這與使用者的 crontab -e 不相同。由於使用者自己的 crontab 并不需要指定身份,但 /etc/crontab 里面當(dāng)然要指定身份啦!以上表的內(nèi)容來說,系統(tǒng)默認(rèn)的例行性工作是以 root的身份來進(jìn)行的。
那么后面那串命令是什么呢?你可以使用『 which run-parts 』搜尋看看,其實(shí)那是一個(gè) bash script 啦!如果你直接進(jìn)入 /usr/bin/run-parts 去看看,會(huì)發(fā)現(xiàn)這支命令會(huì)將后面接的『目錄』內(nèi)的所有文件捉出來運(yùn)行!這也就是說『如果你想讓系統(tǒng)每小時(shí)主動(dòng)幫你運(yùn)行某個(gè)命令,將該命令寫成 script,并將該文件放置到 /etc/cron.hourly/ 目錄下即可』的意思!
現(xiàn)在你知道系統(tǒng)是如何進(jìn)行他默認(rèn)的一堆例行性工作排程了嗎?如果你下達(dá)『 ll /etc/cron.daily 』就可以看到一堆文件,那些文件就是系統(tǒng)提供的 script ,而這堆 scripts 將會(huì)在每天的凌晨 4:02 開始運(yùn)行!這也是為啥如果你是夜貓族,就會(huì)發(fā)現(xiàn)奇怪的是,Linux 系統(tǒng)為何早上 4:02 開始會(huì)很忙碌的發(fā)出一些硬盤跑動(dòng)的聲音!因?yàn)樗仨氁M(jìn)行makewhatis, updatedb, rpm rebuild 等等的任務(wù)嘛!
由於 CentOS 提供的 run-parts 這個(gè) script 的輔助,因此 /etc/crontab 這個(gè)文件里面支持兩種下達(dá)命令的方式,一種是直接下達(dá)命令,一種則是以目錄來規(guī)劃,例如:
- 命令型態(tài)
01 * * * * dmtsai mail -s "testing" kiki < /home/dmtsai/test.txt
以 dmtsai 這個(gè)使用者的身份,在每小時(shí)運(yùn)行一次 mail 命令。
- 目錄規(guī)劃
*/5 * * * * root run-parts /root/runcron
創(chuàng)建一個(gè) /root/runcron 的目錄,將要每隔五分鐘運(yùn)行的『可運(yùn)行檔』都寫到該目錄下,就可以讓系統(tǒng)每五分鐘運(yùn)行一次該目錄下的所有可運(yùn)行檔。
好!你現(xiàn)在大概了解了這一個(gè)咚咚吧!OK!假設(shè)你現(xiàn)在要作一個(gè)目錄,讓系統(tǒng)可以每 2 分鐘去運(yùn)行這個(gè)目錄下的所有可以運(yùn)行的文件,你可以寫下如下的這一行在 /etc/crontab 中:
*/2 * * * * root run-parts /etc/cron.min當(dāng)然羅, /etc/cron.min 這個(gè)目錄是需要存在的喔!那如果我需要運(yùn)行的是一個(gè)『程序』而已,不需要用到一個(gè)目錄呢?該如何是好?例如在偵測(cè)網(wǎng)絡(luò)流量時(shí),我們希望每五分鐘偵測(cè)分析一次,可以這樣寫:
*/5 * * * * root /bin/mrtg /etc/mrtg/mrtg.cfg如何!創(chuàng)建例行性命令很簡(jiǎn)單吧!如果你是系統(tǒng)管理員而且你的工作又是系統(tǒng)維護(hù)方面的例行任務(wù)時(shí),直接修改 /etc/crontab 這個(gè)文件即可喔!又便利,又方便管理呢!
一些注意事項(xiàng)
有的時(shí)候,我們以系統(tǒng)的 cron 來進(jìn)行例行性工作的創(chuàng)建時(shí),要注意一些使用方面的特性。舉例來說,如果我們有四個(gè)工作都是五分鐘要進(jìn)行一次的,那么是否這四個(gè)動(dòng)作全部都在同一個(gè)時(shí)間點(diǎn)進(jìn)行?如果同時(shí)進(jìn)行,該四個(gè)動(dòng)作又很耗系統(tǒng)資源,如此一來,每五分鐘不是會(huì)讓系統(tǒng)忙得要死?呵呵!此時(shí)好好的分配一些運(yùn)行時(shí)間就 OK 啦!所以,注意一下:
- 資源分配不均的問題
當(dāng)大量使用 crontab 的時(shí)候,總是會(huì)有問題發(fā)生的,最嚴(yán)重的問題就是『系統(tǒng)資源分配不均』的問題,以鳥哥的系統(tǒng)為例,我有偵測(cè)主機(jī)流量的資訊,包括:
- 流量
- 區(qū)域內(nèi)其他 PC 的流量偵測(cè)
- CPU 使用率
- RAM 使用率
- 線上人數(shù)即時(shí)偵測(cè)
如果每個(gè)流程都在同一個(gè)時(shí)間啟動(dòng)的話,那么在某個(gè)時(shí)段時(shí),我的系統(tǒng)會(huì)變的相當(dāng)?shù)姆泵?#xff0c;所以,這個(gè)時(shí)候就必須要分別配置啦!我可以這樣做:
| [root@www ~]# vi /etc/crontab 1,6,11,16,21,26,31,36,41,46,51,56 * * * * root CMD1 2,7,12,17,22,27,32,37,42,47,52,57 * * * * root CMD2 3,8,13,18,23,28,33,38,43,48,53,58 * * * * root CMD3 4,9,14,19,24,29,34,39,44,49,54,59 * * * * root CMD4 |
看到了沒?那個(gè)『 , 』分隔的時(shí)候,請(qǐng)注意,不要有空白字節(jié)!(連續(xù)的意思)如此一來,則可以將每五分鐘工作的流程分別在不同的時(shí)刻來工作!則可以讓系統(tǒng)的運(yùn)行較為順暢呦!
- 取消不要的輸出項(xiàng)目
另外一個(gè)困擾發(fā)生在『 當(dāng)有運(yùn)行成果或者是運(yùn)行的項(xiàng)目中有輸出的數(shù)據(jù)時(shí),該數(shù)據(jù)將會(huì)mail 給 MAILTO 配置的帳號(hào) 』,好啦,那么當(dāng)有一個(gè)排程一直出錯(cuò)(例如 DNS的偵測(cè)系統(tǒng)當(dāng)中,若 DNS 上一級(jí)主機(jī)掛掉,那么你就會(huì)一直收到錯(cuò)誤信息!)怎么辦?呵呵!還記得十一章談到的數(shù)據(jù)流重導(dǎo)向吧?直接以『命令重導(dǎo)向』將輸出的結(jié)果輸出到/dev/null 這個(gè)垃圾桶當(dāng)中就好了!
- 安全的檢驗(yàn)
很多時(shí)候被植入木馬都是以例行命令的方式植入的,所以可以藉由檢查 /var/log/cron的內(nèi)容來視察是否有『非您配置的 cron 被運(yùn)行了?』這個(gè)時(shí)候就需要小心一點(diǎn)羅!
- 周與日月不可同時(shí)并存
另一個(gè)需要注意的地方在於:『你可以分別以周或者是日月為單位作為循環(huán),但你不可使用「幾月幾號(hào)且為星期幾」的模式工作』。這個(gè)意思是說,你不可以這樣編寫一個(gè)工作排程:
| 30 12 11 9 5 root echo "just test" <==這是錯(cuò)誤的寫法 |
本來你以為九月十一號(hào)且為星期五才會(huì)進(jìn)行這項(xiàng)工作,無奈的是,系統(tǒng)可能會(huì)判定每個(gè)星期五作一次,或每年的 9 月 11 號(hào)分別進(jìn)行,如此一來與你當(dāng)初的規(guī)劃就不一樣了~所以羅,得要注意這個(gè)地方!上述的寫法是不對(duì)的喔!
可喚醒停機(jī)期間的工作任務(wù)
如果你的 Linux 主機(jī)是作為 24 小時(shí)全天、全年無休的服務(wù)器之用,那么你只要有 atd 與 crond 這兩個(gè)服務(wù)來管理你的例行性工作排程即可。如果你的服務(wù)器并非 24 小時(shí)無間斷的啟動(dòng),那么你該如何進(jìn)行例行性工作?舉例來說,如果你每天晚上都要關(guān)機(jī),等到白天才啟動(dòng)你的 Linux 主機(jī)時(shí),由於 CentOS 默認(rèn)的工作排程都在4:02am 每天進(jìn)行,唔!如此一來不就一堆系統(tǒng)例行工作都沒有人在做了!那可怎么辦?此時(shí)就得要 anacron 這家伙了!
什么是 anacron
anacron 并不是用來取代 crontab 的,anacron 存在的目的就在於我們上頭提到的,在處理非 24 小時(shí)一直啟動(dòng)的 Linux 系統(tǒng)的 crontab 的運(yùn)行!所以 anacron 并不能指定何時(shí)運(yùn)行某項(xiàng)任務(wù),而是以天為單位或者是在啟動(dòng)后立刻進(jìn)行 anacron 的動(dòng)作,他會(huì)去偵測(cè)停機(jī)期間應(yīng)該進(jìn)行但是并沒有進(jìn)行的crontab 任務(wù),并將該任務(wù)運(yùn)行一遍后,anacron 就會(huì)自動(dòng)停止了。
由於 anacron 會(huì)以一天、七天、一個(gè)月為期去偵測(cè)系統(tǒng)未進(jìn)行的 crontab 任務(wù),因此對(duì)於某些特殊的使用環(huán)境非常有幫助。舉例來說,如果你的 Linux 主機(jī)是放在公司給同仁使用的,因?yàn)橹苣┘偃沾蠹叶疾辉谒砸矝]有必要開啟,因此你的 Linux 是周末都會(huì)關(guān)機(jī)兩天的。但是 crontab 大多在每天的凌晨以及周日的早上進(jìn)行各項(xiàng)任務(wù),偏偏你又關(guān)機(jī)了,此時(shí)系統(tǒng)很多 crontab 的任務(wù)就無法進(jìn)行。 anacron 剛好可以解決這個(gè)問題!
那么 anacron 又是怎么知道我們的系統(tǒng)啥時(shí)關(guān)機(jī)的呢?這就得要使用 anacron 讀取的時(shí)間記錄檔 (timestamps) 了!anacron 會(huì)去分析現(xiàn)在的時(shí)間與時(shí)間記錄檔所記載的上次運(yùn)行 anacron 的時(shí)間,兩者比較后若發(fā)現(xiàn)有差異,那就是在某些時(shí)刻沒有進(jìn)行 crontab 羅!此時(shí) anacron 就會(huì)開始運(yùn)行未進(jìn)行的 crontab 任務(wù)了!所以 anacron 其實(shí)也是透過 crontab 來運(yùn)行的!因此 anacron 運(yùn)行的時(shí)間通常有兩個(gè),一個(gè)是系統(tǒng)啟動(dòng)期間運(yùn)行,一個(gè)是寫入 crontab 的排程中。這樣才能夠在特定時(shí)間分析系統(tǒng)未進(jìn)行的 crontab 工作嘛!了解乎!
anacron 與 /etc/anacrontab
anacron 其實(shí)是一支程序并非一個(gè)服務(wù)!這支程序在 CentOS 當(dāng)中已經(jīng)進(jìn)入 crontab 的排程喔!不相信嗎?你可以這樣追蹤看看:
| [root@www ~]# ll /etc/cron*/*ana* -rwxr-xr-x 1 root root 379 Mar 28 2007 /etc/cron.daily/0anacron -rwxr-xr-x 1 root root 381 Mar 28 2007 /etc/cron.monthly/0anacron -rwxr-xr-x 1 root root 380 Mar 28 2007 /etc/cron.weekly/0anacron # 剛好是每天、每周、每月有排程的工作目錄!查閱一下每天的任務(wù)[root@www ~]# cat /etc/cron.daily/0anacron if [ ! -e /var/run/anacron.pid ]; thenanacron -u cron.daily fi # 所以其實(shí)也僅是運(yùn)行 anacron -u 的命令!因此我們得來談?wù)勥@支程序! |
基本上, anacron 的語法如下:
| [root@www ~]# anacron [-sfn] [job].. [root@www ~]# anacron -u [job].. 選項(xiàng)與參數(shù): -s :開始一連續(xù)的運(yùn)行各項(xiàng)工作 (job),會(huì)依據(jù)時(shí)間記錄檔的數(shù)據(jù)判斷是否進(jìn)行; -f :強(qiáng)制進(jìn)行,而不去判斷時(shí)間記錄檔的時(shí)間戳記; -n :立刻進(jìn)行未進(jìn)行的任務(wù),而不延遲 (delay) 等待時(shí)間; -u :僅升級(jí)時(shí)間記錄檔的時(shí)間戳記,不進(jìn)行任何工作。 job :由 /etc/anacrontab 定義的各項(xiàng)工作名稱。 |
所以我們發(fā)現(xiàn)其實(shí) /etc/cron.daily/0anacron 僅進(jìn)行時(shí)間戳記的升級(jí),而沒有進(jìn)行任何 anacron 的動(dòng)作!在我們的 CentOS 中,anacron 的進(jìn)行其實(shí)是在啟動(dòng)完成后才進(jìn)行的一項(xiàng)工作任務(wù),你也可以將 anacron 排入 crontab 的排程中。但是為了擔(dān)心 anacron 誤判時(shí)間參數(shù),因此 /etc/cron.daily/ 里面的 anacron 才會(huì)在檔名之前加個(gè) 0 (0anacron),讓 anacron 最先進(jìn)行!就是為了讓時(shí)間戳記先升級(jí)!以避免 anacron 誤判 crontab 尚未進(jìn)行任何工作的意思。
接下來我們看一下 /etc/anacrontab 的內(nèi)容好了:
| [root@www ~]# cat /etc/anacrontab SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root1 65 cron.daily run-parts /etc/cron.daily 7 70 cron.weekly run-parts /etc/cron.weekly 30 75 cron.monthly run-parts /etc/cron.monthly 天數(shù) 延遲時(shí)間 工作名稱定義 實(shí)際要進(jìn)行的命令串 # 天數(shù)單位為天;延遲時(shí)間單位為分鐘;工作名稱定義可自訂; # 命令串則通常與 crontab 的配置相同![root@www ~]# more /var/spool/anacron/* :::::::::::::: /var/spool/anacron/cron.daily :::::::::::::: 20090315 :::::::::::::: /var/spool/anacron/cron.monthly :::::::::::::: 20090301 :::::::::::::: /var/spool/anacron/cron.weekly :::::::::::::: 20090315 # 上面則是三個(gè)工作名稱的時(shí)間記錄檔以及記錄的時(shí)間戳記 |
由於 /etc/cron.daily 內(nèi)的任務(wù)比較多,因此我們使用每天進(jìn)行的任務(wù)來解釋一下 anacron 的運(yùn)行情況好了。anacron 若下達(dá)『 anacron -s cron.daily 』時(shí),他會(huì)這樣運(yùn)行的:
所以說,時(shí)間戳記是非常重要的!anacron 是透過該記錄與目前的時(shí)間差異,了解到是否應(yīng)該要進(jìn)行某項(xiàng)任務(wù)的工作!舉例來說,如果我的主機(jī)在 2009/03/15(星期天) 18:00 關(guān)機(jī),然后在 2009/03/16(星期一) 8:00 啟動(dòng),由於我的 crontab 是在早上 04:00 左右進(jìn)行各項(xiàng)任務(wù),由於該時(shí)刻系統(tǒng)是關(guān)機(jī)的,因此時(shí)間戳記依舊為 20090315 (舊的時(shí)間),但是目前時(shí)間已經(jīng)是 20090316 (新的時(shí)間),因此run-parts /etc/cron.daily 就會(huì)在啟動(dòng)過 65 分鐘后開始運(yùn)行了。
所以羅, anacron 并不需要額外的配置,使用默認(rèn)值即可!只是我們的 CentOS 只有在啟動(dòng)時(shí)才會(huì)運(yùn)行anacron 就是了。如果要確定 anacron 是否啟動(dòng)時(shí)會(huì)主動(dòng)的運(yùn)行,你可以下達(dá)下列命令:
| [root@www ~]# chkconfig --list anacron anacron 0:off 1:off 2:on 3:on 4:on 5:on 6:off # 詳細(xì)的 chkconfig 說明我們會(huì)在后續(xù)章節(jié)提到,注意看 3, 5 # 的項(xiàng)目,都是 on !那就是有啟動(dòng)啦!啟動(dòng)時(shí)才會(huì)運(yùn)行的意思! |
現(xiàn)在你知道為什么隔了一陣子才將 CentOS 啟動(dòng),啟動(dòng)過后約 1 小時(shí)左右系統(tǒng)會(huì)有一小段時(shí)間的忙碌!而且硬盤會(huì)跑個(gè)不停!那就是因?yàn)?anacron 正在運(yùn)行過去 crontab 未進(jìn)行的各項(xiàng)工作排程啦!這樣對(duì) anacron 有沒有概念了呢? ^_^
重點(diǎn)回顧
- 系統(tǒng)可以透過 at 這個(gè)命令來排程單一工作的任務(wù)!『at TIME』為命令下達(dá)的方法,當(dāng) at 進(jìn)入排程后,系統(tǒng)運(yùn)行該排程工作時(shí),會(huì)到下達(dá)時(shí)的目錄進(jìn)行任務(wù);
- at 的運(yùn)行必須要有 atd 服務(wù)的支持,且 /etc/at.deny 為控制是否能夠運(yùn)行的使用者帳號(hào);
- 透過 atq, atrm 可以查詢與刪除 at 的工作排程;
- batch 與 at 相同,不過 batch 可在 CPU 工作負(fù)載小於 0.8 時(shí)才進(jìn)行后續(xù)的工作排程;
- 系統(tǒng)的循環(huán)例行性工作排程使用 cron 這個(gè)服務(wù),同時(shí)利用 crontab -e 及 /etc/crontab 進(jìn)行排程的安排;
- crontab -e 配置項(xiàng)目分為六欄,『分、時(shí)、日、月、周、命令』為其配置依據(jù);
- /etc/crontab 配置分為七欄,『分、時(shí)、日、月、周、運(yùn)行者、命令』為其配置依據(jù);
- anacron 配合 /etc/anacrontab 的配置,可以喚醒停機(jī)期間系統(tǒng)未進(jìn)行的 crontab 任務(wù)!
本章習(xí)題
( 要看答案請(qǐng)將鼠標(biāo)移動(dòng)到『答:』底下的空白處,按下左鍵圈選空白處即可察看 ) 簡(jiǎn)答題:
- 今天假設(shè)我有一個(gè)命令程序,名稱為: ping.sh 這個(gè)檔名!我想要讓系統(tǒng)每三分鐘運(yùn)行這個(gè)文件一次,但是偏偏這個(gè)文件會(huì)有很多的信息顯示出來,所以我的root 帳號(hào)每天都會(huì)收到差不多四百多封的信件,光是收信就差不多快要瘋掉了!那么請(qǐng)問應(yīng)該怎么配置比較好呢? 這個(gè)涉及數(shù)據(jù)流重導(dǎo)向的問題,我們可以將他導(dǎo)入文件或者直接丟棄!如果該信息不重要的話,那么就予以丟棄,如果信息很重要的話,才將他保留下來!假設(shè)今天這個(gè)命令不重要,所以將他丟棄掉!因此,可以這樣寫: */3 * * * * root /usr/local/ping.sh > /dev/null 2>&1
- 您預(yù)計(jì)要在 2010 年的 2 月 14 日寄出一封給 kiki ,只有該年才寄出!該如何下達(dá)命令? at 1am 2010-02-14
- 下達(dá) crontab -e 之后,如果輸入這一行,代表什么意思?
* 15 * * 1-5 /usr/local/bin/tea_time.sh 在每星期的 1~5 ,下午 3 點(diǎn)的每分鐘,共進(jìn)行 60 次 /usr/local/bin/tea_time.sh 這個(gè)文件。要特別注意的是,每個(gè)星期 1~5 的 3 點(diǎn)都會(huì)進(jìn)行 60 次ㄟ!很麻煩吧~是錯(cuò)誤的寫法啦~應(yīng)該是要寫成:
30 15 * * 1-5 /usr/local/bin/tea_time.sh - 我用 vi 編輯 /etc/crontab 這個(gè)文件,我編輯的那一行是這樣的:
25 00 * * 0 /usr/local/bin/backup.sh
這一行代表的意義是什么? 這一行代表......沒有任何意義!因?yàn)檎Z法錯(cuò)誤!您必須要了解,在 /etc/crontab 當(dāng)中每一行都必須要有使用者才行!所以,應(yīng)該要將原本那行改成:
25 00 * * 0 root /usr/local/bin/backup.sh - 請(qǐng)問,您的系統(tǒng)每天、每周、每個(gè)月各有進(jìn)行什么工作? 因?yàn)?CentOS 系統(tǒng)默認(rèn)的例行性命令都放置在 /etc/cron.* 里面,所以,你可以自行去:/etc/cron.daily/, /etc/cron.week/, /etc/cron.monthly/ 這三個(gè)目錄內(nèi)看一看,就知道啦! ^_^
- 每個(gè)星期六凌晨三點(diǎn)去系統(tǒng)搜尋一下內(nèi)有 SUID/SGID 的任何文件!并將結(jié)果輸出到 /tmp/uidgid.files vi /etc/crontab
0 3 * * 6 root find / -perm +6000 > /tmp/uidgid.files
2002/05/30:第一次完成
2003/02/10:重新編排與加入 FAQ
2005/09/07:將舊的文章移動(dòng)到 此處 。
2005/09/07:呼呼!終於完成風(fēng)格羅~同時(shí)加入一些習(xí)題練習(xí)。
2009/03/12:將舊的文件移動(dòng)到此處。
2009/03/14:加入 batch 這個(gè)項(xiàng)目的說明!與 at 有關(guān)!
2009/03/15:加入了 anacron 這玩意的簡(jiǎn)單說明!
2009/09/11:稍微修訂一下說明語氣與連結(jié)數(shù)據(jù)。
出處:http://vbird.dic.ksu.edu.tw/linux_basic/0430cron.php
總結(jié)
以上是生活随笔為你收集整理的鸟哥的Linux私房菜(基础篇)- 第十六章、例行性工作排程 (crontab)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸟哥的Linux私房菜(基础篇)- 第十
- 下一篇: 鸟哥的Linux私房菜(基础篇)- 第十