王繼敏
【摘 要】在Linux系統(tǒng)運(yùn)維過程中,經(jīng)常會遇到需要定時或周期性的執(zhí)行一些命令或腳本的情況,利用Linux系統(tǒng)提供的定時任務(wù)機(jī)制可以實(shí)現(xiàn)這一功能。對Linux下實(shí)現(xiàn)定時任務(wù)的幾種不同方式進(jìn)行探討,給出了在不同方式下實(shí)現(xiàn)定時任務(wù)的一些具體實(shí)例。
【關(guān)鍵詞】Linux;定時任務(wù)
0 引言
在實(shí)際生產(chǎn)環(huán)境中,經(jīng)常需要定時或周期性的執(zhí)行一些命令或者腳本程序,如在指定時間對系統(tǒng)的用戶訪問量進(jìn)行統(tǒng)計、定期清理臨時文件、定期對日志文件進(jìn)行分析匯總等等。此時可以使用Linux提供的定時任務(wù)機(jī)制來滿足這種需求。這種定時任務(wù)可以分為需要周期性反復(fù)執(zhí)行的定時任務(wù)和僅執(zhí)行一次的定時任務(wù)兩類,本文分別對這兩種定時任務(wù)的實(shí)現(xiàn)給出描述,并簡要介紹在使用過程中需要注意的事項。
本文所述的命令、配置文件等都基于RHEL6.3(Redhat Enterprise Linux 6.3),不同Linux發(fā)行版之間或許有細(xì)微的差別,這些差異不在本文的探討范圍之內(nèi)。
1 一次性定時任務(wù)
1.1 at簡介
某些任務(wù)調(diào)度可能是突發(fā)的、臨時性的、一次性的任務(wù),如在凌晨某時刻對系統(tǒng)執(zhí)行一次升級。這種情況可以使用at命令實(shí)現(xiàn)。at既可以接收來自stdin的命令,也接收預(yù)先寫在文件中的命令。而at的定時任務(wù)能夠得以實(shí)現(xiàn),必須要事先啟動atd系統(tǒng)服務(wù)。[1]
如果RHEL6.3是采用最小化方式安裝的,則at和atd都是沒有安裝的,可以通過以下命令安裝之。
# yum install at
接下來查看一下atd服務(wù)的狀態(tài),將其啟動。
# service atd status
atd is stopped
顯示上面這條信息表示atd服務(wù)還沒有開啟,此時是無法執(zhí)行at定時任務(wù)的,通過以下命令將其開啟。
# service atd start
此后便可以使用at命令設(shè)置定時任務(wù)了。
1.2 at語法及注意事項
at命令的語法可以分為兩種形式,分別是:
(1)at [-f] time
(2)at [options]
at命令的第一種形式會從stdin或者file文件讀取命令,將命令排入隊列,使其于指定時間(time)執(zhí)行,這里的時間既可以是絕對時間如12:00,也可以是相對時間如now+3 minutes等;第二種形式可以列出(使用-l選項)或者刪除(使用-d選項)隊列中的任務(wù)。設(shè)置成功的at計劃任務(wù)會在/var/spool/at下生產(chǎn)一個可執(zhí)行腳本。例如在凌晨2點(diǎn)對磁盤sdb1執(zhí)行一次磁盤檢查任務(wù):
# at 2:00
at> fsck /dev/sdb1
需要注意的是,at的執(zhí)行與終端環(huán)境無關(guān),所有的standard output和standard error都會發(fā)送到執(zhí)行者的郵箱里,當(dāng)然前提是當(dāng)前主機(jī)已經(jīng)安裝并配置好了郵件系統(tǒng)。另外需要注意的是,at通過/etc/at.deny和/etc/at.allow提供了訪問控制措施,以決定哪些用戶可以使用調(diào)度服務(wù)。如果這兩個文件都不存在,則只有root管理員可以使用at;如果只有at.deny文件,而at.allow文件不存在,則除了黑名單之外的所有用戶都可以使用at;如果at.allow文件存在,則只有白名單用戶才可以使用at。
2 周期性定時任務(wù)
2.1 cron簡介
另一類任務(wù)調(diào)度是例行性的,即每隔一定的周期要來辦的事項,這類定時任務(wù)需要使用cron來實(shí)現(xiàn)。Linux系統(tǒng)本身就有許多需要循環(huán)執(zhí)行的例行性任務(wù),如對日志文件進(jìn)行輪替(log rotate)、定期清理/tmp目錄下的臨時文件、定期建立locate數(shù)據(jù)庫等。Cron是一個系統(tǒng)服務(wù),即使RHEL6.3是最小化安裝,這個服務(wù)也是安裝和開啟的。例如下面這條命令:
# service crond status
crond (pid 1032) is running...
上面一行輸出信息表示當(dāng)前定時器服務(wù)crond正在運(yùn)行。
2.2 crontab命令及配置文件
用戶可以使用crontab命令設(shè)定或者查看定時任務(wù)。該命令的主要用法如下:
(1)crontab -l [-u usrer] 列出某個用戶cron服務(wù)的詳細(xì)內(nèi)容
(2)crontab -r [-u usrer] 刪除某個用戶的cron服務(wù)
(3)crontab -e [-u usrer] 編輯某個用戶的cron服務(wù)[2]
例如,系統(tǒng)管理員想刪除Tom用戶的定時任務(wù),可以如下操作:
# crontab -u Tom -r
當(dāng)crontab使用-e參數(shù)時,會自動打開vi編輯器,可以按照規(guī)定語法格式編輯定時任務(wù)。其語法格式為:
Minute Hour Day Month Week Command
分鐘 小時 天 月 星期 命令
其中Minute的取值范圍為0-59,Hour的取值范圍為0-23,Day的取值范圍為1-31,Month的取值為1-12,Week的取值為0-7(0和7都表示星期日),Command即為周期性執(zhí)行的命令或者腳本。
在以上任何值中,星號(*)可以用來代表所有有效的值,譬如月份值中的星號意味著在滿足其它制約條件后每月都執(zhí)行該命令;整數(shù)間的短線(-)指定一個整數(shù)范圍,譬如1-4 意味著整數(shù)1、2、3、4;用逗號(,)隔開的一系列值指定一個列表,譬如3, 4, 6, 8標(biāo)明這四個指定的整數(shù);正斜線(/)可以用來指定間隔頻率,在范圍后加上 / integer意味著在范圍內(nèi)可以跳過 integer,譬如0-59/2 可以用來在分鐘字段定義每兩分鐘;間隔頻率值還可以和星號一起使用,例如,*/3 的值可以用在月份字段中表示每三個月運(yùn)行一次任務(wù);開頭為井號(#)的行是注釋,不會被處理。例如用戶Tom為自己安排一個定時任務(wù),每天刪除/home/Tom/log目錄下五天前的文件,可以如下編輯:
0 2 * * * find /home/Tom/log -type f -mtime +5 -exec rm {} \;
用戶編輯好的定時任務(wù),會保存在/var/spool/cron目錄下的一個和用戶名同名的文件中,這就是用戶級定時任務(wù)的配置文件。還有一類定時任務(wù)是系統(tǒng)級定時任務(wù),通常用于系統(tǒng)的例行性任務(wù)調(diào)度,這類定時任務(wù)的配置文件保存在/etc/crontab文件中,可以直接以root用戶身份打開編輯。其配置文件格式與用戶級定時任務(wù)配置文件的格式類似,只不過在Week和Command兩項之間,多了一個User項,即執(zhí)行者身份——定義該任務(wù)以什么用戶身份執(zhí)行。
和at命令類似,也可以通過編輯/etc/cron.allow和/etc/cron.deny文件,來允許/禁止用戶設(shè)置定時任務(wù)。編輯完黑名單或者白名單后,需要重啟crond服務(wù)以使之生效。
3 anacron機(jī)制
無論是at定時任務(wù)還是cron定時任務(wù),都要求在指定的時刻系統(tǒng)必須是開機(jī)的。這對于生產(chǎn)環(huán)境中24小時不間斷運(yùn)行的服務(wù)器而言自然不是問題,但在一些桌面和工作站使用環(huán)境中則很難做到,如果在任務(wù)預(yù)定執(zhí)行的那一刻系統(tǒng)是關(guān)機(jī)的,則定時任務(wù)失效。而anacron就是為處理非24小時一直在線的Linux系統(tǒng)的定時任務(wù)而設(shè)計的。
anacron并非是取代cron,而是cron的補(bǔ)充。anacron并不能指定在何時執(zhí)行某任務(wù),而是以天為單位或者開機(jī)后立刻檢查停機(jī)期間應(yīng)該但是沒有執(zhí)行的cron任務(wù),并將這些任務(wù)執(zhí)行一遍。
4 結(jié)束語
通過利用Linux系統(tǒng)提供的at和cron機(jī)制,可以方便的安排一些臨時性或周期性的任務(wù)在指定時間執(zhí)行,正確而合理的使用Linux的定時任務(wù)機(jī)制可以有效的提高系統(tǒng)運(yùn)維的效率。
【參考文獻(xiàn)】
[1]鳥哥.鳥哥的Linux私房菜基礎(chǔ)學(xué)習(xí)篇[M].第三版.北京:機(jī)械工業(yè)版社,2010:493-494.
[2]陳素琴.Linux中的定時任務(wù)探討.現(xiàn)代計算機(jī),2010.11:70-71.endprint