Linux command – anacron

如果有固定的工作要做,可以把它寫成 Bash script ,然後放到 /etc/cron.daily , /etc/cron.weekly , /etc/monthly ,就可以在固定時間週期來執行.確切的時間會依據 /etc/crontab 設定檔,請參考 http://benjr.tw/421#cron .

[root@benjr ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01   *   *   *   *   root   run-parts   /etc/cron.hourly
02   4   *   *   *   root   run-parts   /etc/cron.daily
22   4   *   *   0   root   run-parts  /etc/cron.weekly
42   4   1   *   *   root   run-parts  /etc/cron.monthly
0-59/5  *  *  *  *   root   /usr/bin/mrtg   /etc/mrtg/mrtg.cfg

測試環境為 CentOS 6 x86_64 (虛擬機)

從 RHEL / CentOS 6 之後就發現這個檔案是空的,那 /etc/cron.daily , /etc/cron.weekly , /etc/monthly 的週期排程是依據什麼時候來執行呢!

[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

新的週期排程是依據 anacron 的設定檔 /etc/anacrontab.

Anacron (非 Daemon, service) 的運作方式不同於 crond ,先來看看 anacron 的設定檔 /etc/anacrontab 內容如下.

[root@localhost ~]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1	5	cron.daily		nice run-parts /etc/cron.daily
7	25	cron.weekly		nice run-parts /etc/cron.weekly
@monthly 45	cron.monthly		nice run-parts /etc/cron.monthly

anacron 的前兩個欄位為時間設定﹕第一個欄位為 :時段(n) ,第二個欄位為 延遲時間(m).
其中的時段是以天數為單位﹐延遲時間以分鐘為單位,anacron 會檢查每一個排程是否在過去 n 天之內被執行﹐其中的 n 就是第一個欄位之設定值﹔如果已經被執行過﹐則不再理會﹔但如果沒被執行﹐則在延遲 m 分鐘就執行該排程 (為了避免太多排程在開機後一起跑,所以有設定延遲時間)

  • cron.daily : 每天執行一次, 超過一天未執行則 5 分鐘後執行.
  • cron.weekly : 每七天執行一次,超過七天未執行則 25 分鐘後執行,
  • cron.monthly: 每個月執行一次,超過一個月未執行則 45 分鐘後執行,

那 anacron 非 Daemon (service) 是多久執行一次,這個定義在 /etc/cron.hourly/0anacron (每小時執行一次)

[root@localhost ~]# cat /etc/cron.hourly/0anacron 
#!/bin/bash
# Skip excecution unless the date has changed from the previous run 
if test -r /var/spool/anacron/cron.daily; then
    day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
    exit 0;
fi

# Skip excecution unless AC powered
if test -x /usr/bin/on_ac_power; then
    /usr/bin/on_ac_power &> /dev/null
    if test $? -eq 1; then
    exit 0
    fi
fi
/usr/sbin/anacron -s

# Skip excecution unless the date has changed from the previous run
如果 /var/spool/anacron/cron.daily 裡面的時間等同今天的時間,就直接跳出.

# Skip excecution unless AC powered
若目前系統非使用 AC 電源, 就直接跳出.

參數說明:
-s Serialize execution of jobs. Anacron will not start a new job before the previous one finished.

那誰去執行 /etc/cron.hourly/0anacron ? 這個定義在 /etc/cron.d/0hourly

[root@localhost ~]# cat /etc/cron.d/0hourly
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly

整理一下:

  1. Crond 負責檢查 /etc/crontab, /var/spool/cron/*, /etc/cron.d/* 設定檔,並依據時間設定去執行各項工作排程.
  2. /etc/cron.d/0hourly 會每一個小時去執行 /etc/cron.hourly 目錄裡所有的 script ,第一個會去執行 /etc/cron.hourly/0anacron (因為以 0 開頭命名)
  3. Anacron 會依據設定檔 /etc/anacrontab 裡面設定來執行 /etc/cron.daily , /etc/cron.weekly , /etc/monthly 的週期排程內容.
沒有解決問題,試試搜尋本站其他內容

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料