系統(tǒng)經(jīng)常會(huì)主動(dòng)執(zhí)行一些任務(wù)线梗,這些任務(wù)可能又分為“單一”工作與“循環(huán)”工作椰于。
1、什么是例行性工作
有的工作是例行性的仪搔,有的工作是臨時(shí)發(fā)生的瘾婿。
如果計(jì)算機(jī)系統(tǒng)能夠主動(dòng)通知我某些事情的話,那不就輕松很多僻造!
1.1憋他、Linux工作調(diào)度的種類:at,cron
兩種工作調(diào)度的方式:
一種是例行性的髓削,就是每隔一定的周期要來辦的事項(xiàng)竹挡;
一種是突發(fā)性的,就是這次做完以后就沒有的那一種立膛。
at:at是個(gè)可以處理僅執(zhí)行一次就結(jié)束調(diào)度的命令揪罕,不過要執(zhí)行at時(shí)梯码,必須要有atd這個(gè)服務(wù)的支持才行;
crontab:crontab這個(gè)命令所設(shè)置的工作將會(huì)循環(huán)一直執(zhí)行下去好啰⌒ⅲ可循環(huán)的時(shí)間為分鐘、小時(shí)框往、每周鳄抒、每月或每年等。crontab處理可以使用命令執(zhí)行外椰弊,也可編輯/etc/crontab來支持许溅。至于讓crontab可以生效的服務(wù)則是crond這個(gè)服務(wù)。
1.2秉版、Linux上常見的例行性工作
基本上Linux系統(tǒng)常見的例行性任務(wù)有:
進(jìn)行日志文件的輪替(log rotate)贤重;
日志文件分析logwatch的任務(wù);
新建locate的數(shù)據(jù)庫清焕;
whatis數(shù)據(jù)庫的建立并蝗;
RPM軟件日志文件的新建;
刪除臨時(shí)文件秸妥;
與網(wǎng)絡(luò)服務(wù)有關(guān)的分析行為滚停;
2、僅執(zhí)行一次的工作調(diào)度
單一工作調(diào)度的運(yùn)作粥惧,at這個(gè)命令铐刘。
2.1、atd的啟動(dòng)與at運(yùn)行方式
atd這個(gè)服務(wù)調(diào)度at
service atd start
at的運(yùn)行方式:
事實(shí)上影晓,我們使用at這個(gè)命令來生成所要運(yùn)行的工作镰吵,并將這個(gè)工作以文本的方式寫入/var/spool/at目錄內(nèi),該工作便能等待atd這個(gè)服務(wù)的取用并執(zhí)行了挂签。
不過疤祭,并不是所有的人都可以進(jìn)行at工作調(diào)度。所以饵婆,除非是你認(rèn)可的賬戶勺馆,否則先不要讓他們使用at。
我們可以利用/etc/at.allow和/etc/at.deny這兩個(gè)文件來進(jìn)行at的使用限制侨核。
2.2草穆、實(shí)際運(yùn)行單一工作調(diào)度
at這個(gè)命令最重要的地方在于時(shí)間的指定, now + x minutes也是不錯(cuò)的方法搓译。
事實(shí)上悲柱,當(dāng)我們使用at時(shí)會(huì)進(jìn)入一個(gè)at shell的環(huán)境來讓用戶執(zhí)行工作命令,此時(shí)些己,建議你最好使用絕對(duì)路徑來執(zhí)行你的命令豌鸡。
at 的執(zhí)行與終端機(jī)環(huán)境無關(guān)嘿般,而所有的standard output/standard error output都會(huì)傳送到執(zhí)行者的mailbox里面去,不是輸出在屏幕上涯冠。
還要注意的是炉奴,at執(zhí)行過后并沒有任何輸出信息,如果你想要知道命令執(zhí)行沒有蛇更,可以發(fā)送一封郵件告知你瞻赶。
at還有一個(gè)很棒的優(yōu)點(diǎn),那就是“后臺(tái)執(zhí)行”的功能派任!
脫機(jī)繼續(xù)工作的任務(wù)共耍,由于在 at 工作調(diào)度的使用上,系統(tǒng)會(huì)將該項(xiàng)at工作獨(dú)立出你的bash環(huán)境中吨瞎,直接交給系統(tǒng)的atd程序來接管,因此穆咐,當(dāng)你執(zhí)行了at的工作之后就可以立刻脫機(jī)了颤诀,剩下的工作就完全交給Linux管理即可。
at的工作管理:
利用atp來查詢对湃,利用atrm來刪除崖叫。
如果你是在一個(gè)非常忙碌的系統(tǒng)下運(yùn)行at,能不能指定你的工作在系統(tǒng)較閑的時(shí)候才進(jìn)行呢拍柒?可以的心傀,那就是用batch命令吧!
batch:系統(tǒng)有空時(shí)才進(jìn)行的后臺(tái)任務(wù)
其實(shí)batch是利用at來進(jìn)行命令的執(zhí)行拆讯,只是加入了一些控制參數(shù)而已脂男。
這個(gè)batch神奇的地方在于:它會(huì)在CPU工作負(fù)載小于0.8的時(shí)候,才進(jìn)行你執(zhí)行的工作任務(wù)种呐。
負(fù)載的意思是:CPU在單一時(shí)間點(diǎn)所負(fù)責(zé)的工作數(shù)量宰翅,不是CPU的使用率。舉例來說爽室,如果我有一個(gè)程序它需要一直使用CPU的運(yùn)算功能汁讼,那么此時(shí)CPU的使用率可能到達(dá)100%,但是CPU的工作負(fù)載則是趨近于1阔墩,因?yàn)镃PU僅僅負(fù)責(zé)了一個(gè)工作嘿架。如果同時(shí)執(zhí)行這樣的程序兩個(gè),CPU的使用率還是100%啸箫,但CPU的負(fù)載則變成了2耸彪。當(dāng)CPU的工作負(fù)載越大,代表CPU必須要在不同的工作之間進(jìn)行頻繁的工作切換忘苛。
其實(shí)batch也是利用atp和atrm來管理的搜囱。
3丑瞧、循環(huán)執(zhí)行的例行性工作調(diào)度
循環(huán)執(zhí)行的例行性工作調(diào)度則是由cron(crond)這個(gè)系統(tǒng)服務(wù)來控制的。另外蜀肘,用戶也可以進(jìn)行例行性工作調(diào)度绊汹,Linux提供給用戶控制例行性工作調(diào)度的命令是(crontab)。
與at一樣扮宠,我們也可以限制使用crontab的用戶賬戶西乖。在這兩個(gè)文件當(dāng)中,/etc/cron.allow和/etc/cron.deny坛增。
當(dāng)用戶使用crontab這個(gè)命令來新建工作調(diào)度之后获雕,該項(xiàng)工作就會(huì)被記錄到/var/spool/cron里面去了,而且是以賬號(hào)來作為判別的收捣。
注意届案,crontab -r 命令是刪除所有的crontab內(nèi)容。
3.2罢艾、系統(tǒng)的配置文件:/etc/crontab
這個(gè)crontab -e 主要是針對(duì)cron來設(shè)計(jì)的楣颠,如果是系統(tǒng)的例行性任務(wù)時(shí),就需要編輯/etc/crontab這個(gè)文件咐蚯。
基本上童漩,cron這個(gè)服務(wù)的最低檢查限制的是“分鐘”,所以cron會(huì)每分鐘去讀取一次/etc/crontab與/var/spool/cron里面的數(shù)據(jù)內(nèi)容春锋。因此矫膨,只要你編輯完/etc/crontab這個(gè)文件,并且將它保存之后期奔,那么cron的設(shè)置就自動(dòng)會(huì)來執(zhí)行侧馅。由于crontab是讀取到內(nèi)存中的,所以在你修改完/etc/crontab之后呐萌,可能并不會(huì)馬上執(zhí)行施禾,這個(gè)時(shí)候請(qǐng)重啟crond這個(gè)服務(wù)吧。
/etc/crontab這個(gè)文件里面支持兩種執(zhí)行命令的方式搁胆,一種是直接執(zhí)行命令弥搞,一種則是以目錄來規(guī)劃。
3.3渠旁、一些注意事項(xiàng)
資源分配不均問題攀例;
取消不要的輸出選項(xiàng);
安全的檢驗(yàn)顾腊;
周與日粤铭、月不可同時(shí)并存。
4杂靶、可喚醒停機(jī)期間的工作任務(wù)
如果你的Linux主機(jī)24小時(shí)全天梆惯、全年無休的服務(wù)器之用酱鸭,那么你只要有atd與crond這兩個(gè)服務(wù)來管理你的例行性工作調(diào)度即可。如果你的主機(jī)并非24小時(shí)開機(jī)垛吗,那么你的某些例行性任務(wù)可能就無法運(yùn)行凹髓,此時(shí)就得要用到anacron這個(gè)工具了。
4.1怯屉、什么是anacron
anacron并不是用來替代crontab的蔚舀,anacron存在的目的就在于我們上頭提到的,處理非24小時(shí)一直啟動(dòng)的Linux系統(tǒng)的crontab的執(zhí)行锨络。所以annacron并不能指定何時(shí)執(zhí)行某項(xiàng)任務(wù)赌躺,而是以天為單位或者是在開機(jī)后立刻進(jìn)行anacron的操作,它會(huì)去檢測(cè)停機(jī)期間應(yīng)該進(jìn)行但是并沒有進(jìn)行的crontab任務(wù)羡儿,并將該任務(wù)執(zhí)行一遍礼患,然后anacron就會(huì)自動(dòng)停止。
anacron讀取的時(shí)間記錄文件(timestamp)了掠归!anacron會(huì)去分析現(xiàn)在的時(shí)間與時(shí)間記錄文件所記載的上次執(zhí)行anacron的時(shí)間缅叠,兩者比較后若發(fā)現(xiàn)有區(qū)別,那就是在某些時(shí)刻沒有進(jìn)行crontab拂到。此時(shí)anacron就會(huì)開始執(zhí)行未進(jìn)行的crontab任務(wù)了。
所以anacron其實(shí)也是通過crontab來運(yùn)行的码泞,因此anacron運(yùn)行的時(shí)間通常有兩個(gè)兄旬,一個(gè)是系統(tǒng)開機(jī)期間運(yùn)行,一個(gè)是寫入crontab的調(diào)度中余寥,這樣才能在特定時(shí)間分析系統(tǒng)未進(jìn)行的crontab工作领铐。
anacron其實(shí)是一個(gè)程序并非一個(gè)服務(wù)。
如果 anacron 執(zhí)行 cron.daily時(shí)宋舷,它是這樣運(yùn)行的:
1绪撵,由/etc/anacrontab分析到cron.daily這項(xiàng)工作名稱的天數(shù)為1天;
2祝蝠,由/var/spool/anacron/cron.daily取出最近一次執(zhí)行anacron的時(shí)間戳音诈;
3,由上個(gè)步驟與目前的時(shí)間比較绎狭,若差異天數(shù)未1天以上(含1天)细溅,就準(zhǔn)備進(jìn)行命令;
4儡嘶,若準(zhǔn)備進(jìn)行命令喇聊,根據(jù)/etc/anacrontab的設(shè)置將延遲5分鐘;
5蹦狂,延遲時(shí)間過后誓篱,開始執(zhí)行后續(xù)命令朋贬,即“run-parts /etc/cron.daily”這串命令;
6窜骄,執(zhí)行完畢后锦募,anacron程序結(jié)束。
所以說啊研,時(shí)間戳是非常重要的御滩。anacron是通過該記錄與目前的時(shí)間差異,了解到是否應(yīng)該要進(jìn)行某項(xiàng)任務(wù)的工作党远。
現(xiàn)在知道為甚么隔了一陣才將Linux開機(jī)削解,但是開機(jī)后一段時(shí)間內(nèi)系統(tǒng)很忙碌,那就是因?yàn)閍nacron正在執(zhí)行過去crontab未進(jìn)行的各項(xiàng)工作制度沟娱。