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