系統(tǒng)經(jīng)常會主動執(zhí)行一些任務(wù),這些任務(wù)可能又分為“單一”工作與“循環(huán)”工作。
1、什么是例行性工作
有的工作是例行性的,有的工作是臨時發(fā)生的。
如果計算機系統(tǒng)能夠主動通知我某些事情的話,那不就輕松很多!
1.1、Linux工作調(diào)度的種類:at,cron
兩種工作調(diào)度的方式:
一種是例行性的,就是每隔一定的周期要來辦的事項;
一種是突發(fā)性的,就是這次做完以后就沒有的那一種。
at:at是個可以處理僅執(zhí)行一次就結(jié)束調(diào)度的命令,不過要執(zhí)行at時,必須要有atd這個服務(wù)的支持才行;
crontab:crontab這個命令所設(shè)置的工作將會循環(huán)一直執(zhí)行下去??裳h(huán)的時間為分鐘、小時、每周、每月或每年等。crontab處理可以使用命令執(zhí)行外,也可編輯/etc/crontab來支持。至于讓crontab可以生效的服務(wù)則是crond這個服務(wù)。
1.2、Linux上常見的例行性工作
基本上Linux系統(tǒng)常見的例行性任務(wù)有:
進行日志文件的輪替(log rotate);
日志文件分析logwatch的任務(wù);
新建locate的數(shù)據(jù)庫;
whatis數(shù)據(jù)庫的建立;
RPM軟件日志文件的新建;
刪除臨時文件;
與網(wǎng)絡(luò)服務(wù)有關(guān)的分析行為;
2、僅執(zhí)行一次的工作調(diào)度
單一工作調(diào)度的運作,at這個命令。
2.1、atd的啟動與at運行方式
atd這個服務(wù)調(diào)度at
service atd start
at的運行方式:
事實上,我們使用at這個命令來生成所要運行的工作,并將這個工作以文本的方式寫入/var/spool/at目錄內(nèi),該工作便能等待atd這個服務(wù)的取用并執(zhí)行了。
不過,并不是所有的人都可以進行at工作調(diào)度。所以,除非是你認可的賬戶,否則先不要讓他們使用at。
我們可以利用/etc/at.allow和/etc/at.deny這兩個文件來進行at的使用限制。
2.2、實際運行單一工作調(diào)度

at這個命令最重要的地方在于時間的指定, now + x minutes也是不錯的方法。
事實上,當我們使用at時會進入一個at shell的環(huán)境來讓用戶執(zhí)行工作命令,此時,建議你最好使用絕對路徑來執(zhí)行你的命令。
at 的執(zhí)行與終端機環(huán)境無關(guān),而所有的standard output/standard error output都會傳送到執(zhí)行者的mailbox里面去,不是輸出在屏幕上。
還要注意的是,at執(zhí)行過后并沒有任何輸出信息,如果你想要知道命令執(zhí)行沒有,可以發(fā)送一封郵件告知你。
at還有一個很棒的優(yōu)點,那就是“后臺執(zhí)行”的功能!
脫機繼續(xù)工作的任務(wù),由于在 at 工作調(diào)度的使用上,系統(tǒng)會將該項at工作獨立出你的bash環(huán)境中,直接交給系統(tǒng)的atd程序來接管,因此,當你執(zhí)行了at的工作之后就可以立刻脫機了,剩下的工作就完全交給Linux管理即可。
at的工作管理:
利用atp來查詢,利用atrm來刪除。

如果你是在一個非常忙碌的系統(tǒng)下運行at,能不能指定你的工作在系統(tǒng)較閑的時候才進行呢?可以的,那就是用batch命令吧!
batch:系統(tǒng)有空時才進行的后臺任務(wù)
其實batch是利用at來進行命令的執(zhí)行,只是加入了一些控制參數(shù)而已。
這個batch神奇的地方在于:它會在CPU工作負載小于0.8的時候,才進行你執(zhí)行的工作任務(wù)。
負載的意思是:CPU在單一時間點所負責的工作數(shù)量,不是CPU的使用率。舉例來說,如果我有一個程序它需要一直使用CPU的運算功能,那么此時CPU的使用率可能到達100%,但是CPU的工作負載則是趨近于1,因為CPU僅僅負責了一個工作。如果同時執(zhí)行這樣的程序兩個,CPU的使用率還是100%,但CPU的負載則變成了2。當CPU的工作負載越大,代表CPU必須要在不同的工作之間進行頻繁的工作切換。

其實batch也是利用atp和atrm來管理的。
3、循環(huán)執(zhí)行的例行性工作調(diào)度
循環(huán)執(zhí)行的例行性工作調(diào)度則是由cron(crond)這個系統(tǒng)服務(wù)來控制的。另外,用戶也可以進行例行性工作調(diào)度,Linux提供給用戶控制例行性工作調(diào)度的命令是(crontab)。
與at一樣,我們也可以限制使用crontab的用戶賬戶。在這兩個文件當中,/etc/cron.allow和/etc/cron.deny。
當用戶使用crontab這個命令來新建工作調(diào)度之后,該項工作就會被記錄到/var/spool/cron里面去了,而且是以賬號來作為判別的。



注意,crontab -r 命令是刪除所有的crontab內(nèi)容。
3.2、系統(tǒng)的配置文件:/etc/crontab
這個crontab -e 主要是針對cron來設(shè)計的,如果是系統(tǒng)的例行性任務(wù)時,就需要編輯/etc/crontab這個文件。
基本上,cron這個服務(wù)的最低檢查限制的是“分鐘”,所以cron會每分鐘去讀取一次/etc/crontab與/var/spool/cron里面的數(shù)據(jù)內(nèi)容。因此,只要你編輯完/etc/crontab這個文件,并且將它保存之后,那么cron的設(shè)置就自動會來執(zhí)行。由于crontab是讀取到內(nèi)存中的,所以在你修改完/etc/crontab之后,可能并不會馬上執(zhí)行,這個時候請重啟crond這個服務(wù)吧。

/etc/crontab這個文件里面支持兩種執(zhí)行命令的方式,一種是直接執(zhí)行命令,一種則是以目錄來規(guī)劃。
3.3、一些注意事項
資源分配不均問題;
取消不要的輸出選項;
安全的檢驗;
周與日、月不可同時并存。
4、可喚醒停機期間的工作任務(wù)
如果你的Linux主機24小時全天、全年無休的服務(wù)器之用,那么你只要有atd與crond這兩個服務(wù)來管理你的例行性工作調(diào)度即可。如果你的主機并非24小時開機,那么你的某些例行性任務(wù)可能就無法運行,此時就得要用到anacron這個工具了。
4.1、什么是anacron
anacron并不是用來替代crontab的,anacron存在的目的就在于我們上頭提到的,處理非24小時一直啟動的Linux系統(tǒng)的crontab的執(zhí)行。所以annacron并不能指定何時執(zhí)行某項任務(wù),而是以天為單位或者是在開機后立刻進行anacron的操作,它會去檢測停機期間應(yīng)該進行但是并沒有進行的crontab任務(wù),并將該任務(wù)執(zhí)行一遍,然后anacron就會自動停止。
anacron讀取的時間記錄文件(timestamp)了!anacron會去分析現(xiàn)在的時間與時間記錄文件所記載的上次執(zhí)行anacron的時間,兩者比較后若發(fā)現(xiàn)有區(qū)別,那就是在某些時刻沒有進行crontab。此時anacron就會開始執(zhí)行未進行的crontab任務(wù)了。
所以anacron其實也是通過crontab來運行的,因此anacron運行的時間通常有兩個,一個是系統(tǒng)開機期間運行,一個是寫入crontab的調(diào)度中,這樣才能在特定時間分析系統(tǒng)未進行的crontab工作。
anacron其實是一個程序并非一個服務(wù)。


如果 anacron 執(zhí)行 cron.daily時,它是這樣運行的:
1,由/etc/anacrontab分析到cron.daily這項工作名稱的天數(shù)為1天;
2,由/var/spool/anacron/cron.daily取出最近一次執(zhí)行anacron的時間戳;
3,由上個步驟與目前的時間比較,若差異天數(shù)未1天以上(含1天),就準備進行命令;
4,若準備進行命令,根據(jù)/etc/anacrontab的設(shè)置將延遲5分鐘;
5,延遲時間過后,開始執(zhí)行后續(xù)命令,即“run-parts /etc/cron.daily”這串命令;
6,執(zhí)行完畢后,anacron程序結(jié)束。
所以說,時間戳是非常重要的。anacron是通過該記錄與目前的時間差異,了解到是否應(yīng)該要進行某項任務(wù)的工作。
現(xiàn)在知道為甚么隔了一陣才將Linux開機,但是開機后一段時間內(nèi)系統(tǒng)很忙碌,那就是因為anacron正在執(zhí)行過去crontab未進行的各項工作制度。