Linux 技巧: 用 cron 和 at 排程作業如何輕松地管理系統 |
|
級别: 中級
Ian Shields ([email protected]), 進階程式員, IBM
2007 年 8 月 27 日
系統管理者需要在系統負載低的午夜運作作業,或者需要每天或每月運作作業,同時又不願意犧牲睡眠時間或假期。排程任務的其他原因包括自動執行日常任務或者確定每次都以相同的方式處理任務。本文幫助您使用和
cron
功能排程作業定期運作或在指定的時間運作一次。
at
Linux® 和 UNIX® 系統允許排程任務在以後執行一次,或者重複運作。本文是從 developerWorks 教程 “LPI 102 考試準備:管理任務” 摘錄的,講解如何排程作業定期運作,或在指定的時間運作一次。
在 Linux 系統上,許多管理任務必須頻繁地定期執行。這些任務包括輪轉日志檔案以避免裝滿檔案系統、備份資料和連接配接時間伺服器來執行系統時間同步。上面提到的教程更詳細地介紹了這些管理任務。在本文中,學習 Linux 中提供的排程機制,包括
cron
和
anacron
設施以及
crontab
和
at
指令。即使系統常常關機,
anacron
也可以幫助排程作業。
以一定的時間間隔運作作業
以一定的時間間隔運作作業需要使用 cron 設施進行管理,它由
crond
守護程序和一組表(描述執行哪些操作和采用什麼樣的頻率)組成。這個守護程序每分鐘喚醒一次,并通過檢查 crontab 判斷需要做什麼。使用者使用
crontab
指令管理 crontab。
crond
守護程序常常是在系統啟動時由 init 程序啟動的。
為了簡單,假設希望定期運作清單 1 所示的指令。這個指令實際上隻報告日期和時間,其他什麼事都不做,但是它可以說明如何使用
crontab
設定 cron 作業,而且還可以通過輸出看到作業運作的時間。設定 crontab 條目需要一個包含轉義的 shell 元字元的字元串,是以适合于簡單的指令和參數。在這個示例中,将從腳本 /home/ian/mycrontab.sh 運作
echo
指令,這個腳本不需要參數。 這可以減少處理轉義字元的工作。
清單 1. 一個簡單的指令示例
|
建立 crontab
使用
crontab
指令和
-e
(表示 “edit”)選項建立 crontab。這會打開
vi
編輯器,除非在 EDITOR 或 VISUAL 環境變量中指定了另一種編輯器。
每個 crontab 條目包含六個字段:
- 分鐘
- 小時
- 日
- 月
- 星期
- 由
執行的字元串sh
分鐘和小時的範圍分别是 0-59 和 0-12,日和月的範圍分别是 1-31 和 1-12。星期的範圍是 0-6,0 表示星期日。星期也可以指定為 sun、mon、tue 等等。第 6 個字段包含前 5 個字段之後的所有内容,它是要傳遞給
sh
的字元串。百分号(%)将轉換為空行,是以如果要使用 % 或其他任何特殊字元,就要在前面加上反斜線(/)。第一個 % 之前的一行傳遞給 shell,這個 % 之後的所有行都作為标準輸入傳遞。
各個與時間相關的字段可以指定一個單獨的值、值的範圍(比如 0-10 或 sun-wed)或者以逗号分隔的單獨值和範圍清單。清單 2 給出一個 crontab 條目示例。
清單 2. 一個簡單的 crontab 示例
|
在這個示例中,我們的指令在 7 月的每個星期五和星期六晚上 10 點到午夜之間的第 0、20、40 分鐘(每 20 分鐘)執行。關于指定時間的其他方式的細節,參見 crontab(5) 的手冊頁。
輸出
您可能想知道對來自指令的輸出會如何處理。為使用 cron 而設計的大多數指令會使用 syslog 在日志中記錄輸出(參見教程 “LPI 102 考試準備:管理任務” 中的讨論)。但是,定向到 stdout 的輸出會通過電子郵件發送給使用者。清單 3 給出我們的指令示例可能産生的輸出。
清單 3. 通過電子郵件發送的 cron 輸出
|
crontab 存儲在哪裡?
|
用
crontab
指令建立的 crontab 存儲在 /etc/spool/cron 下面的一個子目錄中,這個子目錄與建立 crontab 的使用者同名,是以上面的 crontab 存儲在 /etc/spool/cron/ian 中。是以,與
passwd
指令一樣,
crontab
指令是一個用根權限運作的 suid 程式。
/etc/crontab
除了 /var/spool/cron 中的使用者 crontab 檔案之外,
cron
還會檢查 /etc/crontab 檔案和 /etc/cron.d 目錄中的檔案。在這些系統 crontab 中,在第五個時間字段(星期)和指令之間增加了一個字段。這個字段指定哪個使用者應該運作這個指令,一般情況下是根使用者。清單 4 給出一個 /etc/crontab 檔案示例。
清單 4. /etc/crontab
在這個示例中,真正的工作由
run-parts
指令執行,它運作 /etc/cron.hourly、/etc/cron.daily 等目錄中的腳本;/etc/crontab 僅僅控制執行作業的時間。注意,這裡的所有指令都作為根使用者運作。還要注意,crontab 可以包含 shell 變量指派,這些指派會在運作指令之前執行。
anacron
cron 适合那些連續運作的系統。對于那些常常不開機的系統,比如筆記型電腦,可以使用另一個實用程式 anacron(表示 “anachronistic cron”)排程每日、每周或每月執行的作業。anacron 不處理每小時執行的作業。
anacron 在 /var/spool/anacron 中保留時間戳檔案,記錄作業運作的時間。當 anacron 運作時,它檢查自作業上一次運作以來是否已經經過了所需的天數,如果需要,就運作作業。anacron 的作業表存儲在 /etc/anacrontab 中,檔案格式與 /etc/crontab 略有不同。與 /etc/crontab 一樣,/etc/anacrontab 可以包含環境設定。每個作業有四個字段:
- 周期
- 延遲
- 作業辨別符
- 指令
周 期是天數,但是可以指定為 @monthly,這確定作業每個月隻運作一次(無論這個月中有多少天)。延遲是在作業符合運作條件之後,到實際啟動它之前等待的分鐘數。可以使用這個設 置防止在系統啟動時集中執行作業。作業辨別符可以包含除了斜線(/)之外的所有非空白字元。
/etc/crontab 和 /etc/anacrontab 都通過直接編輯進行更新。不使用
crontab
指令更新這些檔案或 /etc/cron.d 目錄中的檔案。
|
在指定的時間運作作業
有時候,需要隻運作作業一次而不是定期運作。為此,應該使用
at
指令。要運作的指令是從
-f
選項指定的檔案讀取的,如果沒有使用
-f
,那麼從 stdin 讀取。
-m
選項向使用者發送郵件,即使指令沒有 stdout。
-v
選項顯示運作作業的時間。這個時間也顯示在輸出中。
清單 5 給出一個運作
mycrontest.sh
腳本的示例。清單 6 顯示在運作作業之後通過郵件發送給使用者的輸出。注意,這裡的輸出比對應的 cron 作業輸出要簡單一些。
清單 5. 使用 at 指令
|
清單 6. 來自 at 的作業輸出
|
時間的設定可以非常複雜。清單 7 給出幾個示例。參見
at
的手冊頁、/usr/share/doc/at/timespec 檔案或 /usr/share/doc/at-3.1.10/timespec 這樣的檔案(這個示例中的 3.1.10 是
at
包的版本号)。
清單 7. at 指令使用的時間值
|
|
at
指令還有一個
-q
選項。随着隊列的增長,作業的
nice
值也會增長。 還有一個
batch
指令,它與
at
指令相似,但是作業隻在系統負載足夠低時運作。這些特性的細節參見手冊頁。
|
管理排程的作業
列出排程的作業
可以管理 cron 和 at 作業。使用
crontab
指令和
-l
選項列出 crontab,使用
atq
指令顯示用
at
指令加入隊列中的作業,見清單 8。
清單 8. 顯示排程的作業
|
如果希望檢視
at
排程執行的實際指令,那麼可以使用
at
指令并加上
-c
選項和作業号。您會注意到,在發出
at
指令時生效的大多數環境設定會随排程的作業一起儲存。清單 9 給出清單 7 和清單 8 中作業 15 的部分輸出。
清單 9. 使用 at -c 并加上作業号
|
注意,我們腳本檔案的内容已經複制在一個 here-document 中,這個 here-document 将由 SHELL 變量指定的 shell 執行(如果沒有設定 SHELL 變量,就使用 /bin/sh)。關于 here-document 的資訊參見教程 “LPI 101 考試準備,主題 103:GNU 和 UNIX 指令”。
删除排程的作業
可以使用
cron
指令和
-r
選項删除所有排程的 cron 作業,見清單 10。
清單 10. 顯示并删除 cron 作業
|
要删除系統 cron 或 anacron 作業,應該編輯 /etc/crontab、/etc/anacrontab 或者編輯或删除 /etc/cron.d 目錄中的檔案。
可以使用
atrm
指令加作業号删除用
at
指令排程的一個或多個作業。多個作業應該用空白分隔。清單 11 給出一個示例。
清單 11. 用 atq 和 atrm 顯示并删除作業
|
|
配置使用者對作業排程的通路
如果檔案 /etc/cron.allow 存在,那麼非根使用者必須在其中列出,才能使用
crontab
和 cron 設施。如果 /etc/cron.allow 不存在,但是 /etc/cron.deny 存在,那麼其中列出的非根使用者不能使用
crontab
或 cron 設施。如果這兩個檔案都不存在,那麼隻允許超級使用者使用這個指令。空的 /etc/cron.deny 檔案允許所有使用者使用 cron 設施,這是預設情況。
/etc/at.allow 和 /etc/at.deny 檔案對 at 設施起相似的作用。
|
了解更多資訊
|