[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.monthlyRANDOM_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 20130426cron.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 運作的方式如下:
- Cron 啟動,執行 /etc/cron.d 目錄中的檔案
- /etc/cron.d/0hourly 執行 /etc/cron.hourly 目錄中的檔案
- /etc/cron.hourly/0anacron 啟動 Anacron
- Anacron 讀取 /etc/acacrontab 設定檔
- /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 -scron.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)
參考資料:
- redhat Deployment Guide: Chapter 21. Automating System Tasks
- Nico Schottelius: How cron.hourly, cron.daily and cron.weekly work
- UnixServerAdmin: How to Setup Anacron in CentOS/RHEL 6.x
- Faris Raouf: Centos 6 x86_64 cron.daily template bug (and how to fix it)
- 鳥哥的私房菜:例行性工作排程
- Benjamin: Linux 自動備份並刪除舊的備份檔教學適合CentOS、Fedora、Ubuntu XAMPP
- 不自量力 の Weithenn:邁向 RHCE 之路 (Day12) - 排程 (at、crontab、anacron)
- 等很久資訊室 yam site: 工作排程 (Cron , Anacron)
- 柏青哥的 SuSE Linux -- 排程工作與系統紀錄檔
- theurbanpenguin: Learning CentOS Linux 6 3 Lesson 26 Using CRON to automate tasks
沒有留言 :
張貼留言