2013-05-02

CentOS 6.4 (64位元) 定期排程 以備份 Moodle 網站為例

所需要安裝的套件
[root@localhost ~]# rpm -qa | grep cronie
cronie-1.4.4-7.el6.x86_64
cronie-anacron-1.4.4-7.el6.x86_64

排程作業執行方式執行時間設定檔適用情況
Anacron頻率式延遲+隨機延遲/etc/anacrontab非長時間開機
Cron週期式固定無延遲/etc/crontab長時間開機

先來看 Anacron 的設定檔
[root@localhost log]# 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
RANDOM_DELAY=45:隨機的等待時間,預設最小值是 6
START_HOURS_RANGE=3-22:排程任務可以被執行的時間區間
period in days:任務被執行的頻率,以『天』為單位
delay in minutes:執行任務前的等待時間
job-identifier:記錄檔中任務的識別名稱
command:執行的指令

從以上資訊可以知道:
這個排程會在每天 03:00-22:00 間執行,以 cron.daily 這個任務為例,每天會被執行一次
若系統開機發現任務沒執行(比對時間),則 5 分鐘 + 隨機等待時間 6~45 分鐘後會開始執行 cron.daily 的任務

例如:20130503 08:30 系統開機,09:01 Anacron 比對 cron.daily/weekly/monthly 前次執行時間
20130502
20130426
20130426
cron.daily 超過 1 天,cron.weekly 超過 7 天
則 cron.daily 將會在 (5+44) 分鐘後執行,cron.weekly 會在 (25+44) 分鐘後執行
May  3 09:01:01 localhost anacron[1918]: Will run job `cron.daily` in 49 min.
May  3 09:01:01 localhost anacron[1918]: Will run job `cron.weekly` in 69 min.
* /var/log/cron 記錄

所以可以知道這個排程所執行的時間是不固定的,但每天一定會執行一次
如果系統並非長時間開機,使用 Anacron 排程則可以確保排程被執行
這是 CentOS 6.x 預設的排程模式

Anacron 運作的方式如下:
  1. Cron 啟動,執行 /etc/cron.d 目錄中的檔案
  2. /etc/cron.d/0hourly 執行 /etc/cron.hourly 目錄中的檔案
  3. /etc/cron.hourly/0anacron 啟動 Anacron
  4. Anacron 讀取 /etc/acacrontab 設定檔
  5. /etc/acacrontab 設定檔執行 /etc/cron.daily、/etc/cron.weekly 跟 /etc/cron.mounthly 目錄中的檔案

底下是 Anacron 詳細的運作過程
/etc/cron.d/0hourly 每小時會去執行 /etc/cron.hourly 目錄中的任務
[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
接著 /etc/cron.hourly/0anacron 會去比對時間記錄檔
[root@localhost ~]# cat /etc/cron.hourly/0anacron
#!/bin/bash
#in case file doesn't exist
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

# in case anacron is already running,
# there will be log (daemon won't be running twice).
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
cron.daily/weekly/mounthly 所記錄的時間
[root@localhost log]# cat /var/spool/anacron/cron.{dai,week,month}ly
20130502
20130426
20130426
如果任務執行的時間跟紀錄的時間一樣就不會執行
不一樣的話會啟動 Anacron
Anacron 讀取 /etc/anacrontab 設定檔


Cron 的設定檔如下
[root@localhost anacron]# cat /etc/crontabs
cat: /etc/crontabs: No such file or directory
[root@localhost anacron]# 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
格式:分 時 天 月 週 使用者 執行指令
舉個例子:
02 00 * * * root /backup-moodle/mysql_backup_daily.sh
每天 00:02 以 root 執行 /backup-moodle/mysql_backup_daily.sh
所以時間是固定的,週期性的執行排程

過去更改設定檔完,都會將服務重開,但排程不用!
因為 cron 每分鐘都會去檢查 /etc/anacrontab 檔案、/etc/crontab 檔案、/etc/cron.d/ 目錄跟 /var/spool/cron/ 目錄

排程還可以針對使用者來設定,登入要設定的使用者,使用指令
crontab -e
格式跟 /etc/crontab 一樣,但不要指定使用者名稱!,只要週期跟執行指令

也可以透過 /etc/cron.allow 或 /etc/cron.deny (則一即可)來允許或拒絕使用者的排程


接下來開始設定備份 moodle 網站排程

建立一個備份檔存放的資料夾
mkdir backup-moodle
建立 mysql 資料庫備份的 shell 檔:mysql_backup_daily.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
/sbin/service mysqld stop
cd /backup-moodle
tar -jcpf mysql.`date +%Y-%m-%d`.tar.bz2 /var/lib/mysql
/sbin/service mysqld start
exit 0
建立 moodle 網站備份的 shell 檔:moodle_backup_daily.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
cd /backup-moodle
tar -jcpf moodle.`date +%Y-%m-%d`.tar.bz2 /var/www/html/moodle
exit 0
建立 moodle 資料夾備份的 shell 檔:moodledata_backup_daily.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
cd /backup-moodle
tar -jcpf moodledata.`date +%Y-%m-%d`.tar.bz2 /var/www/moodledata
exit 0
設定上述三個檔案權限為 777
chmod 777 mysql_backup_daily.sh
chmod 777 moodle_backup_daily.sh
chmod 777 moodledata_backup_daily.sh
採固定排程,編輯 crontab 設定檔
vi /etc/crontab
每天 00:02 備份 mysql 資料庫
每天 00:04 備份 moodle 網站資料
每天 00:06 備份 moodledata 資料夾
02 00 * * * root /backup-moodle/mysql_backup_daily.sh
04 00 * * * root /backup-moodle/moodle_backup_daily.sh
06 00 * * * root /backup-moodle/moodledata_backup_daily.sh
*注意要用絕對路徑
存檔離開,完成 moodle 網站排程設定

看 log 檔查證,確實 crontab 排程在我們指定的時間執行
May  3 00:02:01 localhost CROND[2117]: (root) CMD (/backup-moodle/mysql_backup_daily.sh)
May  3 00:04:01 localhost CROND[2331]: (root) CMD (/backup-moodle/moodle_backup_daily.sh)
May  3 00:06:01 localhost CROND[2344]: (root) CMD (/backup-moodle/moodledata_backup_daily.sh)

參考資料:

  1. redhat Deployment Guide: Chapter 21. Automating System Tasks
  2. Nico Schottelius: How cron.hourly, cron.daily and cron.weekly work
  3. UnixServerAdmin: How to Setup Anacron in CentOS/RHEL 6.x
  4. Faris Raouf: Centos 6 x86_64 cron.daily template bug (and how to fix it)
  5. 鳥哥的私房菜:例行性工作排程
  6. Benjamin: Linux 自動備份並刪除舊的備份檔教學適合CentOS、Fedora、Ubuntu XAMPP
  7. 不自量力 の Weithenn:邁向 RHCE 之路 (Day12) - 排程 (at、crontab、anacron)
  8. 等很久資訊室 yam site: 工作排程 (Cron , Anacron)
  9. 柏青哥的 SuSE Linux -- 排程工作與系統紀錄檔
  10. theurbanpenguin: Learning CentOS Linux 6 3 Lesson 26 Using CRON to automate tasks

沒有留言 :

張貼留言