如果有固定的工作要做,可以把它寫成 Bash script ,然後放到 /etc/cron.daily , /etc/cron.weekly , /etc/cron.monthly , /etc/cron.monthly ,就可以在固定時間週期來執行.確切的時間會依據 /etc/crontab 設定檔,請參考 https://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
整理一下:
- Crond 負責檢查 /etc/crontab, /var/spool/cron/*, /etc/cron.d/* 設定檔,並依據時間設定去執行各項工作排程.
- /etc/cron.d/0hourly 會每一個小時去執行 /etc/cron.hourly 目錄裡所有的 script ,第一個會去執行 /etc/cron.hourly/0anacron (因為以 0 開頭命名)
- Anacron 會依據設定檔 /etc/anacrontab 裡面設定來執行 /etc/cron.daily , /etc/cron.weekly , /etc/monthly 的週期排程內容.