Linux 提供了4種自動化工作排程管理的服務,分別是 1.cron 2.at 3.batch 以及 4.anacron. 每一種的使用時機皆不相同, cron 適用於重複發生的工作,at 適用於某一特定時間一執行的工作而 batch 則當系統負載低於 0.8 時才會去執行排程的工作.anacron 只有在 cron 沒有完成排程內的工作時才會去完成 cron 沒做的工作.
Cron
從 RHEL / CentOS 6 之後 Cron 的自動執行固定時間週期 ( cron.daily , cron.hourly , cron.monthly , cron.weekly ) 有改變,請參考 https://benjr.tw/5712
Step 0:所需的套件
如果要使用 cron 的服務,請先確定 vixie-cron 與 crontabs 套件已經安裝,vixie-cron 套件主要提供以下兩個程式來完成自動化排程的工作.
- crond – cron功能的daemon
- crontab – 編排時間表排程程式
而 crontabs 套件則提供一些系統預設的自動排程內容,並確定 cron 服務已經在啟動.
[root@benjr ~]# chkconfig crond on [root@benjr ~]# service crond start
Step 1:系統的設定排程
系統的 cron 主要設定檔為 /etc/crontab ,相較於使用者的crontab檔 ,系統的多一個使用者的欄位,內容如下:
[root@benjr ~]# vi /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
說明:
- SHELL – 表示執行 cron 將採用哪種 bash,預設為 /bin/bash
- PATH – 表示將要執行的指令存放在在哪些目錄中
- MAILTO – 表示要將 cron 執行的結果寄給哪位使用者,預設為 root ,如果你將 MAILTO="" 此時將不再寄送.
- HOME – 表示???
- crontab – 時間的表示法為 minute hour day month dayofweek command
- minute: 可以從 0-59 的整數
- hour: 可以從 0-23 的整數
- day: 可以從 1-31 (但當月份的日子必須存在才會執行)
- month: 可以從 1-12 (可以是月份的縮寫 jan , feb , mar , apr , may , jun , jul , aug , sep , oct , nov ,dec)
- dayofweek : 可以從 0-7 ,0 和 7 皆為星期天.(可以是星期的縮寫 sun , mon , tue , wed, thu , fri , sat)
- command : 將要執行的指令
其中的 /etc/cron.hourly,/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthly 都是目錄,且前面有加一個參數 run-parts的目的就是要執行目錄下所有可執行程式.而 /usr/bin/mrtg /etc/mrtg/mrtg.cfg 是檔案,就不需要加參數 run-parts
其他時間的表示方式 (* 用來表示任何時間):
- 如要讓系統每 5分鐘執行一次可再 minuts 設定成 0-59/5 或 */5 ,同理可用在月份 */3 就是每三個月執行一次.
- 0,15,30,45 * * * * 表示每 15 分鐘(每個整點的 0,15,30,45 分)執行一次
- * * * * * 用來表示每一分鐘執行一次
- 13 13 13 * 5 則每星期五13點13分和每個月的13號13點13分都會執行MyProgram (因為月使用 * 所以每個月都會執行)
- 可以用 6,7 或者 1-5 來表示一段清單.如
- 0 1 * * 6,7 則每星期的六日才會執行.
- 0 1 * * 1-5 則每星期的一至五都會執行.
cron 每一分鐘即會檢查 /etc/crontab , /etc/cron.d/ /var/spool/cron 目錄是否有更新,如有更新 cron 將會紀錄下來等待時間到之後執行.所以你可以將你想要自動排程的工作內容寫至 /etc/crontab 中,或者 /etc/cron.d 目錄中(語法同剛剛介紹的),而一般的使用者就只能用 /var/spool/cron 來進行排程.接下來就來看看一般使用者的自動排程.
Step 2:一般使用者的設定排程
一般使用者無法編輯 /etc/crontab 所以系統提供指令來讓使用者使用自動排程,每個使用者都有自己的排程設定檔,當執行crontab,其實相當於修改 /var/spool/cron 目錄內的檔案(如果使用者名稱為 user1 則會有一個相對應的 /var/spool/cron/user1 檔案存在).
指令 # crontab [options]
-e 使用vi來編輯crontab檔案
-l 顯示 crontab 檔內容
-r 移除 crontab 檔
-u user 編輯其他使用者crontab檔,只有root有權限使用此參數
ex: 每日在 6 AM 自動執行MyProgram
[root@benjr ~]# crontab -e 0 6 * * * MyProgram
進入 vi 編輯器修改 crontab 的內容,儲存後並離開,預設的編輯器為 vi,可以修改 EDITOR 變數來更改預設編輯器,如果編輯器要修改成為 pico 時,直接指定 "# export EDITOR=pico"
當 crontab 執行後會將執行成功或失敗的結果 e-Mail 給使用者.
Step 3:cron 的存取控制
/etc/cron.allow 以及 /etc/cron.deny 可以用來限制使用者對於 cron 的存取限制, root 則不在限制中.當 /etc/cron.allow 存在時,只有列在其中的使用者能使用 cron ,而 /etc/cron.deny 便會被忽略.如果 /etc/cron.allow 不存在時,所有列在 /etc/cron.deny 中的使用者無法使用 cron這兩個檔的格式為每一行放置一位使用者.如:
[root@benjr ~]# cat /etc/cron.deny user1 user2 ……
設定存取權限後下次使用者就無法增加或刪除 cron 的內容.但是之前建立的還是會執行.
At & Batch
Step 0:所需的套件
如果要使用 at 的服務,請先確定 at 套件已經安裝,at 套件主要提供At 與 Batch兩種自動化工作排程.先確定 at 服務已經在啟動
[root@benjr ~]# chkconfig at on [root@benjr ~]# service at start
Step 1:At 的設定排程
at 只適用於於某一特定時間一執行的工作,如要執行可以直接在命令列下鍵入 #at time, 中比較重要的是 time 的參數,接下來我們就來看看 time 的參數要怎麼下.
time 的格式
- HH.MM – 你可以用幾點幾分來表示,如果時間已過則會在明天執行,例如時間設為 7:00 但是此時已經 8:00 ,那這項工作要等到明天 7:00 才會執行.
- now + 時間 – 這邊的時間可以為分(minute),時(hour),天(day),如 now + 5 days 五天後現在的時間執行.除了可以用 now 外,還是可以指定時間,如 4pm +3 days ,就是三天後的 4 AM 執行.以上只是列出常用的時間的表示法,更多的時間表示法,請參考 /usr/share/doc/at-version/timespec再鍵入完 #at time 後會出現 at > 的提示符號.此時就可以開始輸入要執行的工作.如要結束請鍵入 ctrl + D 來完成輸入.
[root@benjr ~]# at 10:30 at> echo "test only" > /root/test at> <EOT> job1 at 2004-10-21 10:30
如果你不喜歡在命令列下執行,你可以加參數 -f 就可以從檔案來讀取要執行的工作.而加上 -m 會在工作結束時寄 mail 給使用者.
Step 2:Batch 的設定排程
用法直接在命令列下鍵入 #batch ,輸入想要執行的工作.時間不需輸入,要等系統負載低於 0.8 時,工作就會執行. 輸入方式如同 at.
Step 3:At & Batch 的排程管理
在鍵入 at & Batch 的排程後,如需要在管理,可以使用 atq 來檢視等待中的工作或 atrm 刪除等待中的工作.
[root@benjr ~]# at 10:30 at> echo "test only" > /root/test at> <EOT> job1 at 2004-10-21 10:30
看一下哪些工作還在等待中
[root@benjr ~]# atq 1 2004-10-21 10:30 a root
想將他刪除
[root@benjr ~]# atrm 1
再看一下哪些工作還在等待
[root@benjr ~]# atq
已經沒有工作在等待了
Step 4:at 的存取控制
/etc/at.allow 以及 /etc/at.deny 可以用來限制使用者對於 at 的存取限制, root 則不在限制中.當 /etc/at.allow 存在時,只有列在其中的使用者能使用 at ,而 /etc/at.deny 便會被忽略.如果 /etc/at.allow 不存在時,所有列在 /etc/at.deny 中的使用者無法使用 cron ,當 /etc/at.allow 與 /etc/at.deny 都不存在時,將沒有使用者可以使用 at .系統預設會存在一個空白的 /etc/at.deny.這兩個檔的格式為每一行放置一位使用者.如:
[root@benjr ~]# cat /etc/at.deny user1 user2 ……
設定存取權限後下次使用者就無法增加或刪除 at 的內容.但是之前建立的還是會執行.
anacron
從 RHEL / CentOS 6 之後 anacron 的自動化執行有改變,請參考 https://benjr.tw/5712
Step 0:所需的套件
如果要使用 anacron 的服務,請先確定 anacron 套件已經安裝,並確定 cron 服務已經在啟動.
[root@benjr ~]# chkconfig anacrond on [root@benjr ~]# service anacrond start
Step 1: anacron 的運作原理
anacron 的運作方式不同於 crond ,anacron 只有在 cron 沒有做排程內的工作時會去完成 cron 沒做的事.通常只有當系統關機一陣子重新開機後才有可能發生.而 anacron 的設定檔存在 /etc/anacrontab.
內容如下
[root@benjr ~]# cat /etc/anacrontab #/etc/anacrontab:configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # These entries are useful for a Rea Hat Linux system 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
anacron 的時間設定有兩個欄位﹕
時段(n) 和 延遲時間(m).其中的時段是以天數為單位﹐延遲時間以分鐘為單位,anacron 會檢查每一個排程是否在過去 n 天之內被執行﹐其中的 n 就是第一個欄位之設定值﹔如果已經被執行過﹐則不再理會﹔但如果沒被執行﹐則在 anacron 服務啟動(通常是開機的時候)之後的延遲 m 分鐘就執行該排程﹐
至於 anacron 怎麼知道 cron 是否執行.是看檔案的 timestamp,所以在./etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly 目錄內都會有 0anacron,來執行 update timestamp 的動作/etc/cron.hourly/, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly 目錄內 0anacron 檔
內容如下
[root@benjr ~]# cat /etc/cron.daily/0anacron #!/bin/sh # # anacron's cron script # # This script updates anacron time stamps. It is called through run-parts # either by anacron itself or by cron. # # The script is called "0anacron" to assure that it will be executed # _before_ all other scripts. anacron -u cron.daily
其中的 anacron -u cron.daily 的功能在於 update timestamp,這樣系統下次重開機也不會被 anacron 執行.
script file 並利用 cron 去定期執行
最近試著寫些 script file 並利用 cron 去定期執行,但發生了一件怪事.我手動執行該 script file 完全無誤,但是把他丟到 cron 裡面有一項指令竟連不會去執行. 該指令為系統指令 “reboot” ,難道利用 cron 還是有權限的問題嗎??查詢了半天原來我需要將整個路徑完全寫入,比如 reboot 需要寫成/sbin/reboot (所有的系統指令皆該如此).
RHEL 6 使用 cronie 套件以取代 vixie-cro
Red Hat Enterprise Linux 6 包含了 cronie 套件,以取代 vixie-cron 詳細內容請見 RHEL 6 網站說明.
http://docs.redhat.com/docs/zh-TW/Red_Hat_Enterprise_Linux/6/html/Migration_Planning_Guide/ch04s13.html