Linux 學習筆記(八)週期性進程

讓一個腳本或者命令在沒有任何人爲干預的情況下執行往往是非常有用處的。例如,您可能需要讓一個腳本去驗證(比如說,每隔半個小時驗證一次)您網絡中的路由器和橋接器都在正確工作,並且在發現問題的時候讓它給您發電子郵件。

1 cron: 按時間表執行命令

在 20 世紀 70 年代,cron 最初出現在 UNIX 的大家族中。Linux 發行版本所帶版本稱爲 ISC cron,或者 Vixie Cron,在我所使用的 Ubuntu 10.10 發行版本上是 Vixie Cron,然而不知道什麼原因,Fedora 17 系統上的cron 已經改名叫crond 了。

cron 的配置文件稱爲“crontab”,它是“cron table”的縮寫。cron 在 3 個地方查找 crontab 文件:/var/spool/cron(SUSE 上是/var/spool/cron/tabs,而在 Debian 和 Ubuntu 上是/var/spool/cron/crontabs)、/etc/cron.d/etc/crontab

每個用戶的 crontab 文件都保存在 /var/spool/cron 目錄下。一般而言,一個用戶(最多)有一個 crontab 文件。crontab 命令把 crontab 文件傳入和傳出這個目錄。

負責安排由系統管理員制定的系統維護以及其他任務的 crontab 文件,都保存在 /etc/crontab 文件以及 /etc/cron.d 目錄下的其他文件裏。這些文件的格式與每個用戶自己在 /var/spool/cron 下的 crontab 文件格式略有不同,因爲它們允許以任何用戶身份來執行命令。cron 以完全一樣的方式對待/etc/crontab 文件和/etc/cron.d 目錄下的文件。一般而言,/etc/crontab 供系統管理員手工維護,而/etc/cron.d 目錄則提供了一個地方,軟件包把它們可能需要的任何 crontab 項安裝在這裏。

2 crontab 文件的格式

一個系統上的所有 crontab 文件都使用一種類似的格式。在每一行的第一列中可以使用 "#" 號來引入註釋。每個非註釋行包含 6 或 7 個字段,它代表一條命令:

minute hour day month weekday [username] command

前 6 個字段用空白隔開,但在 command 字段中的空白則按照原意對待。

crontab 的時間規範如下表所示:

字段 描述 範圍
minute 分鐘 0~59
hour 小時 0~23
day 1~31
month 1~12
weekday 星期 0~6(0=Sunday)

每個和時間相關的字段可以包含:

  • 星號,它可以匹配所有字符
  • 一個整數,它必須精確匹配
  • 用短劃線隔開的兩個整數,它們匹配的是值的範圍
  • 一系列用逗號隔開的整數或者範圍,它們匹配任何被列出的值

時間範圍可以包含一個步長值。例如,時間序列 0、3、6、9、12、15、18 可以更簡潔地寫成 0-18/3。月份和日期的名字也可以使用易記的文字名。

時間格式

45 10 * * 1-5

表示“上午 10:45,從週一到週五”。Tips: 不要把星號放在第一個字段中,除非你想讓這個命令每分鐘都運行。

注意 weekday 字段和 day 字段有潛在的二義性。每一天既是星期中的一天,也是月中的一天。如果同時指定了 weekday 字段和 day 字段,滿足兩個條件之一的天就被選中。例如:

0,30 * 13 * 5

表示“星期五每半個小時,以及每月 13 號每半個小時”而不是“既是 13 號又是星期五的那天每半個小時”。

command 就是要執行的 sh 命令行。它可以是任何有效的 shell 命令,而且不應該加引號。cron 認爲command 一直是這行的末尾,它可以包含空格或者製表符。

cron 使用百分號(%)來表示 command 字段中的換行。只有到第一個百分號之前的文本纔會包含在實際命令中,其餘行則作爲該命令的標準輸入。

下面就來看一下 Ubuntu 默認情況下 /etc/crontab 文件的配置情況:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

該配置首先指定了執行進程的 SHELL 環境以及 PATH 路徑,指定了使用命令的搜索路徑。在每個小時的 17 分鐘的時候執行一次 /etc/cron.hourly下的所有腳本;每天的 6:25 分檢查一下/usr/sbin/anacron 是否爲可執行文件,是則執行anacron 所設定的週期性進程;又或者執行/etc/cron.daily 下的所有腳本文件(本人對shell 編程還不太熟悉呀,看上去應該是那個意思吧,有錯的地方還請指出,哈哈)。接下來就是每週的執行進程,每月的執行進程。

3 crontab 管理

crontab filenamefilename 安裝爲 crontab 文件,它將替換 crontab 文件的任何以前版本。crontab -e 檢出 crontab 的一個副本,調用編輯器(由環境變量 EDITOR 所指定)打開它,然後將其重新提交給 crontab 目錄。crontab -l 將 crontab 中的內容列在標準輸出上,crontab -r 將會刪除它,不給您留下 crontab 文件的一點兒內容。

root 可以給 crontab 帶一個 username 參數,這樣就能夠查看或編輯其他用戶的 crontab 文件了。

$ sudo crontab -u devid -r

將刪除屬於用戶 devid 的 crontab 文件。

4 cron 的常見用途

Linux 系統經常會帶有一些預先安裝好的 crontab 項,這些項主要是在 /etc/cron.d 目錄下。如果想使這些標準的配置項不起作用,那麼可以在每行的開頭插入一個 "#" 號,把它們註釋掉。不要完全刪除它們,也許以後還用得着。

除了採用 /etc/cron.d 目錄這種機制外,Linux 發行版本還預先安裝了若干 crontab 配置項,它們能運行在一組爲大家所熟悉的目錄中的腳本,從而給軟件包提供了另一種不必對 crontab 文件做任何編輯,就能安裝週期性任務的方法。例如,/etc/cron.hourly 每小時運行一次,/etc/cron.daily 每天運行一次,/etc/cron.weekly 每週運行一次,/etc/cron.monthly 每月運行一次。

4.1 清理文件系統

清理系統的垃圾文件問題的一個解決辦法就是,用 cron 構造一些在夜間回收磁盤空間的工作,現代的系統一般帶有這種功能,但我們最好還是檢驗一下自己系統的默認行爲,確保它適用於您所處的環境。

下面是採用 find 命令的幾個慣用方法:

$ sudo find / -xdev -type f '(' -name core -o name 'core.[0-9]*' ')' -atime +7 -exec rm -f { } ';'

這條命令將刪除那些在一個星期中都沒有被訪問的 core 映像文件。-xdev 參數用來確保 find 命令不會執行到根文件系統之外的文件系統中去,這項限制在那些交叉安裝了很多文件系統的網絡中是非常重要的。

參數 -type f 很重要,因爲 Linux 的內核源代碼包括一個目錄也叫做 core,不應該刪除它。

$ sudo find / -xdev -atime +3 '(' -name '#*' -o -name '.#*' -o -name '*.CKP' -o
-name '*~' -o -name '.nfs*' ')' -exec rm -f { } ';'

這條命令將刪除那些用 #、.# 或者 .nfs 開頭的,或者用 ~ 以及 .CKP 結尾且 3 天內都沒有被訪問過的文件。不同種類的臨時文件和編輯器備份文件都是這一模式的典型代表。

$ cd /tmp; sudo find . ! -name . ! -name lost+found -type d -mtime +3 -exec
rm -rf { } ';'

這條命令將遞歸刪除 /tmp 下在 72 小時之內沒有被修改過的所有子目錄。/tmp 中的普通文件會在系統啓動時被系統啓動腳本刪除,但有些系統不會刪除目錄。如果存在名爲lost+found 的目錄,那麼就要特殊對待而不能刪除它。如果/tmp 是一個獨立的文件系統的話,這就非常重要了。

5 其他的日程安排程序: anacron 和 fcron

一般而言,cron 不能彌補因爲系統宕機或者機器時間出現不連續的情況而錯過執行的命令。不過,Vixic Cron 的確在努力。

膝上機以及其他並不長期開機的機器與 cron 的關係更不好,採用 cron 彌補軟件對它們有好處。anacron 這個軟件對cron 有很好的補充作用,它是一種按照時間間隔來安排任務執行的工具。在anacron 這個軟件的世界裏,用戶只需要求某條特殊的命令每星期執行一次,但用不着指定它在每週一的凌晨 2 點執行。anacroncron 不同,它維護着每條命令最近執行時間的記錄,所以它只要比較這個時間、指定的時間間隔,以及當前時間就能判定是否需要再次執行命令。

anacron 本身必須在 cron 裏使用。雖然 anacron 安排時間的粒度是天,但是每天多運行anacron 幾次就會有意義了——如果知道cron 始終能夠在每天同一時間運行 anacron,那麼可能就不會首先考慮使用 anacron 了。類似地,在系統啓動的時候運行 anacron 也會有意義。

fcron 是一種更有雄心彌補 cron 不足的軟件,它也包括類似 anacron 的功能,fcronanacron 不同,它的目標明顯就是要代替 Vixie Cron。它支持幾種高級的日程安排方法,用cronanacron 配置語言都做不到。不過,人們不得不質疑,比起 fcron 增加的複雜性和使用不標準的日程安排造成的混亂,這些功能的實用價值是否值得。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章