Linux – cron , at , batch & anacron

Loading

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

其他時間的表示方式 (* 用來表示任何時間):

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

  1. HH.MM – 你可以用幾點幾分來表示,如果時間已過則會在明天執行,例如時間設為 7:00 但是此時已經 8:00 ,那這項工作要等到明天 7:00 才會執行.
  2. 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 執行.

沒有解決問題,試試搜尋本站其他內容

6 thoughts on “Linux – cron , at , batch & anacron

  1. 自動引用通知: services | Benjr.tw
  2. script file 並利用 cron 去定期執行

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

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料