Product SiteDocumentation Site

9.7. 以 cronatd 使用排定的工作

cron 是後台進程,負責執行排定且重複的命令 (每天、每週等);atd 則執行單一的命令,但在未來的某個特定時間點。
在 Unix 系統裡,很多工作都需定期規律地執行:
預設所有的使用者都可定期執行工作。每個使用者有自己的 crontab 記錄定期執行的命令。可以使用 crontab -e (其內容儲存在 /var/spool/cron/crontabs/user 檔案內) 命令編輯它。
根使用者有自己的 crontab,不過也使用 /etc/crontab 檔案,或寫入額外的 crontab 檔案於 /etc/cron.d 資料夾內。最後兩個解決方案有其優勢,在執行命令時辦識使用者。
cron 套件包括預設定期執行的命令:
很多 Debian 套件依賴此服務:把維護腳本置於此資料夾,確保其服務的最佳運作。

9.7.1. crontab 檔案的格式

crontab 每列以六個 (或七個) 欄位描述排定的命令:
  • 分鐘的值 (從 0 到 59);
  • 小時值 (從 0 到 23);
  • 每月的日數值 (從 1 到 31);
  • 月的值 (從 1 到 12);
  • 每週的日數值 (從 0 到 7,1 表示星期一,星期天可以是 0 或 7;也可用星期的前三個英文字母表示,如 SunMon等);
  • 必須以使用者名稱執行 (在 /etc/crontab 檔案與其位在 /etc/cron.d/ 內,但不在使用者自己的 crontab 檔案內);
  • 執行的命令 (滿足前五個欄位的條件時)。
這些內容的詳情記錄在 crontab(5) 手冊內。
每個值都可以表格的清單方式顯示 (以逗點區隔)。a-b 表示在 ab 之間的值。a-b/c 表示以固定增量 c 的間隔 (如:0-10/2 表示實際狀況是 0,2,4,6,8,10)。星號 * 為萬用字元,表示所有的可能值。

範例 9.2. crontab 檔案的範例

#Format
#min hour day mon dow  command

# Download data every night at 7:25 pm
 25  19   *   *   *    $HOME/bin/get.pl

# 8:00 am, on weekdays (Monday through Friday)
 00  08   *   *   1-5  $HOME/bin/dosomething

# Restart the IRC proxy after each reboot
@reboot /usr/bin/dircproxy

9.7.2. 使用 at 命令

at 在未來的特定時間執行某個命令。以命令列參數的模式在指定的時間與日期執行,並把結果以標準方式鍵入。鍵入當前的 shell 就可以執行該命令。at 甚至保留當前的環境,以便重現執行該命令的情境。以慣例顯示時間:16:124:12pm 代表下午 4 點 12 分。日期可以使用歐洲或西方的格式,包括 DD.MM.YY (27.07.15 表示27日7月2015年),YYYY-MM-DD (等同於 2015-07-27),MM/DD/[CC]YY (就是,12/25/1512/25/2015 指的是12月25日,2015),或 MMDD[CC]YY (即 12251512252015 代表12月25日,2015)。少了它,則在時間到就執行 (同一天、或若時間已過則是隔天)。也可寫成 “today” 或 “tomorrow”,就是今天或明天。
$ at 09:00 27.07.15 <<END
> echo "Don't forget to wish a Happy Birthday to Raphaël!" \
>   | mail lolando@debian.org
> END
warning: commands will be executed using /bin/sh
job 31 at Mon Jul 27 09:00:00 2015
還有另個方法可以延後執行命令的時間點:at now + 數字 間隔間隔 可以是 小時、或 數字 指明執行命令前的時間。
取消 cron 排定的工作,祗需執行 crontab -e 並刪除在 crontab 檔案中對應的列。對於使用 at 的工作,同樣簡單:執行 atrm 工作編號 就可以了。排定時由 at 命令指定工作編號,可以用 atq 命令列出當前工作的清單,籨而找到該工作編號。