作者: khoguan (元) 站內: khoguan
標題: cron 與 anacron 的不同與配合
時間: Thu Jul 18 00:06:46 2002
以前在公司每天晚上都得自動 ftp 一些生產、出貨資訊給
H 開頭的某資訊大廠。雖然我的 ftp script 寫的算是相當
smart 會做一些傳送成功與否的檢查,並發email通知雙方。
但是若 ftp server 本身掛了,就不行了,因為連 cron job
都起不來,一切免談。即使機器後來 reboot 成功,等到人
發現有問題,再去重送資料,都已經太晚了。問題就出在
cron daemon 是既往不究的。漏失掉的 cron jobs 它是不會
自動在重開機時補回來的。
同樣的,cron jobs 中,屬於系統維護的一些工作項目,
同樣會遭遇到這種問題,特別是在沒有經常開著的個人機
器上。睡覺、出門前就關了機,導致一些預設排在深夜或
假日的系統維護工作就沒做了。
在 Linux 上,Christian Schwarz 就開發了 anacron 來
補救。它不是full-time daemon 會像 cron 每分鐘檢查
cron jobs, 而是得要設在 boot-time scripts 中,每次
開機時,檢查 /etc/anacrontab 的設定,看看那些 jobs
是不是過了指定的天數,卻還不曾執行過,如果是的話,
就執行它來補救。這些 jobs 得另外設在 /etc/anacrontab 中,
獨立於 cron jobs 之外,其格式為:
period delay job-identifier command
period 是日數。anacron 只是以相對日數來看,既無法做
更細的時間切割,也無法定下確切的某個日期。它會去
/var/spool/anacron 目錄中,找到與 job-identifier 同名
的檔案,看它裡面記錄的日期,然後計算從那天到今天,是
不是「厝內兮(e5)工課(khang1-khue3)猶無做」,要是還沒
做就補做。而 delay 是給點緩衝的分鐘數,避免開機 script
一執行到 anacron整個系統被這一大堆該補做的 anacron jobs
拖累了。cf.Mandrake的設定 /etc/anacrontab 中的時程表
1 5 cron.daily run-parts /etc/cron.daily
7 10 cron.weekly run-parts /etc/cron.weekly
30 15 cron.monthly run-parts /etc/cron.monthly
咦!這些不是和 /etc/crontab 一樣的「穡頭(sit4-thau5)」嗎?
若是按照/usr/share/doc/anacron-2.3/README 中的建議,是叫人
檢討 /etc/crontab /etc/cron.d 中的每日、每週、每月例行公事,
挑出該歸給 anacron管的項目,寫到 /etc/anacrontab 中。
不過,Mandrake(或是 Redhat 我未求證)則選擇省事的做法,讓
crontab 和 anacrontab 都做同樣的事。開機時,就跑 anacron.
若是 cron job 的時間到了時,就透過 cron daemon 來跑。
cf. /etc/crontab
01 * * * * root nice -n 19 run-parts /etc/cron.hourly
02 4 * * * root nice -n 19 run-parts /etc/cron.daily
22 4 * * 0 root nice -n 19 run-parts /etc/cron.weekly
42 4 1 * * root nice -n 19 run-parts /etc/cron.monthly
那本來該一天跑一次的,會不會變成跑兩次呢?有可能,所以
要採用這種共用機制時,就要注意,不要有哪個 job 不能容
許多跑一次的。另外,他就在每個 cron.*ly 目錄中,設個
0anacron script, 讓它第一個跑,它所做的事就只是
anacron -u cron.daily
-u 是 update /var/spool/anacron 中的 timestamp files,
實際上卻沒真的做事。如果是 anacron 執行的,那麼最後它
跑完 job 時,就會再去 update 一次 timestame files. 如
果這是 cron 執行的,他本身不會 update anacron 的 timestamp
但因為是做同樣的事,也有必要讓 anacron 在下次開機時
知道 update 過了。所以就 cron 就呼叫 anacron 執行一下
anacron 的 timestamp。而為什麼要第一個叫它(檔名為
0anacron,則 run-parts 依序執行,第一個執行它),這樣子
當目錄後面的 script 在執行時,若是另外手動run anacron
時,就不會馬上重覆相同動作了。
anacron 是屬於系統維護者的指令,一般 user 也能執行它,
但是好像沒效果。而且 /var/spool/anacron 中的 filestamp
files 都是 400 mode. anacron 並非 setuid 所以 end-user
run 了 anacron 也無法 upate timestamp. 既然如此,為什麼
要將 /usr/sbin/anacron 設成 global executable 呢?大概
是仍然可以透過 sudoer 機制,來給其他人有機會執行。
前述有關 ftp 文件給客戶的問題,若要透過 anacron 來補救,
就要和系統管理者商量,請他將 ftp script 排進 anacrontab 中。
這樣子和系統管理混在一起,不是很好。但是既然系統會不正常
掛掉,要求管理者這樣做,也不過份吧。或是另設不同名的
anacrontab files 放這類非關sysadmin的動作, 將它們置於
/etc/anacron.d 目錄(模仿 cron.d)然後在 boot script 另外
run 它
Hasfile=`/bin/ls /etc/anacron.d | wc -l`
if [ $Hasfile -gt 0 ]; then
for i in /etc/anacron.d/*
do
anacron -t $i
done fi
Hmm.. Overkilling...
下次你開機完後,過了幾分鐘,若是聽到硬碟響個不停,用 top
發現屬於 cron.daily 中的指令在 run, 不要以為那是 cron
daemon 正在補工作,其實是 anacron 在做同樣的事。
Mandrake(Redhat?)將 anacron 設成 runlevel service
~$ chkconfig --list anacron
anacron 0:關閉 1:關閉 2:開啟 3:開啟 4:開啟 5:開啟 6:關閉
Reference: anacron(8) anacrontab(5) cron(8)
/usr/share/doc/anacron-2.3/README
---------------
草稿 2002/07/17
Copyright by 潘科元