3,189 瀏覽數

自動化工作排程管理

RedHat Linux 提供了4種工作排程的服務,分別是 1.cron  2.at  3.batch 以及 4.anacron每一種的使用時機皆不相同, cron 適用於重複發生的工作,at 適用於某一特定時間一執行的工作而 batch 則當系統負載低於 0.8 時才會去執行排程的工作.anacron 只有在 cron 沒有完成排程內的工作時才會去完成 cron 沒做的工作.

Cron

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
其他時間的表示方式:

  1. 如要讓系統每5分鐘執行一次可再 minuts 設定成 0-59/5 或  */5 ,同理可用在月份 */3 就是每三個月執行一次.
  2. * 用來表示任何時間.如
  3. 13 13 13 * 5 MyProgram
    則每星期五13點13分和每個月的13號13點13分都會執行MyProgram (因為月使用 * 所以每個月都會執行)
  4. 可以用 6,7  或者 1-5 來表示一段清單.如
  5. 0 1 * * 6,7 MyProgram 則每星期的六日才會執行.
    0 1 * * 1-5 MyProgram 則每星期的一至五都會執行.

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 的內容.但是之前建立的還是會執行.

6 個網友的想法 “自動化工作排程管理

  1. 自動參照通知: services | Benjr.tw

  2. 自動參照通知: 核心 & 系統日記檔 | Benjr.tw

  3. 自動參照通知: Drupal 7 – Poor man’s cron | Benjr.tw

  4. 自動參照通知: Ubuntu 自動化工作排程管理 | Benjr.tw

  5. script file 並利用 cron 去定期執行

    最近試著寫些 script file 並利用 cron 去定期執行,但發生了一件怪事.我手動執行該 script file 完全無誤,但是把他丟到 cron 裡面有一項指令竟連不會去執行. 該指令為系統指令 “reboot" ,難道利用 cron 還是有權限的問題嗎??查詢了半天原來我需要將整個路徑完全寫入,比如 reboot 需要寫成/sbin/reboot (所有的系統指令皆該如此).

  6. 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

發表迴響