Gentoo Logo

Gentoo Linux Cron 指南

內容:

1.  Cron 基礎

cron 是做什麼用的?

Cron 是一個根據 crontab 的輸入資料執行排程程序的服務。他藉由每分鐘啟動, 檢查每個使用者的 crontab 是否有要執行的程序來完成這個功能。

注意: 要注意的是 crontab 同時是排定程序的列表名稱以及編輯列表時下的指令。

實際上...

這裡至少有三種你可以從 Portage 中選擇的 cron 實作程式。他們全部都有類似的介面。 都使用叫做 crontab 或相似名稱的指令。除此之外,也有一個相關的工具,叫做 Anacron,可以在沒有持續運行的機器上工作。

在我們開始使用 cron 之前,你要先選擇使用那一套實作程式。為了方便起見,在底下有 收集關於他們每一個的資訊。

2.  那一個 cron 適合你?

Vixie cron

Vixie cron 是依據 SysV cron 完整實作的 cron。每個使用者有他自己的 crontab 並且 允許在 crontab 中指定特別的環境變數。和其他 cron 不同的是,他也支援 SELinux 還 有 PAM。他支援的架構少於 Dcron,但是比 Fcron 多。

sys-process/vixie-cron 的功能:

  • 支援 SELinux
  • 支援 PAM /etc/security/limits.conf
  • 在 crontab 中設定環境變數 (PATH, SHELL, HOME, 等等。)
  • 每個使用者可以有他自己的 crontab,權限是由 cron.allow 及 cron.deny 控管。

Dillon's Cron

Dcron 著重在簡單,嚴謹以及安全的 cron 實作。他並不允許在 crontab 指定環境變數, 並且所有的 cron 排程工作是由 /bin/sh 執行。如同 Vixie cron,每個使 用者可以有他們自己的 crontab。

sys-process/dcron 的功能:

  • 快速,簡單並且沒有不必要的功能。
  • 存取 crontab 的權限僅限 cron 群組,也就是說他不依賴任何外部的功能。

Fcron

Fcron 目標是取代 Vixie cron 及 Anacron。他的設計是可以在沒有持續執行的系統工作, 而且包入許多額外的功能,他有程序啟動限制,序列式的程序控制,指定程序優先權的能力 以及在系統啟動時安排執行程序的能力。查看 fcron 首頁取得更多資訊。

sys-process/fcron 的功能:

  • 為不是持續運行的系統設計,例如說,如果一個程序忽略掉了在重開機後他會去執行這個程序。
  • 在 crontab 中設定環境變數及許多選項
  • 每個使用者可以有他們自己的 crontab,權限是由 cron.allow 及 cron.deny 控制。
  • 加強的 crontab 語法,支援許多新功能

Anacron

Anacron 並不是 cron 服務,有時候和一個 cron 服務結合在一起工作。他依照指定的日期 間格執行指令。這程式並不會假設系統是持續執行,所以會執行系統關機時忽略的工作。 Anacron 通常依賴一個 cron 服務每天執行他。

3.  使用 cron

安裝

選擇你最喜歡的 cron 程式然後安裝他。

原始碼 3.1: 安裝 cron

# emerge dcron
# rc-update add dcron default
# /etc/init.d/dcron start

額外的,如果你沒有安裝 Fcron,可能也想要安裝 Anacron。

原始碼 3.2: 安裝 anacron

# emerge anacron
# rc-update add anacron default
# /etc/init.d/anacron start

系統 crontab

一些 cron 安裝後的訊息告訴你要執行 crontab /etc/crontab/etc/crontab 這個檔案是你的 系統 crontab。Gentoo 預設安裝使 用他來執行在 /etc/cron.{daily,hourly,weekly,monthly} 中的 script。 要注意的是 Vixie-cron 自動排程 /etc/crontab 中的程序。Dcron 及 Fcron 使用者需要在他們每次改變 /etc/crontab 後執行 crontab /etc/crontab

注意在系統 crontab 中排程的程序並不會在 crontab -l 的程序列表中顯示。

當然,你可以選擇不使用任何系統 crontab。如果你是使用 Dcron 或 Fcron,不要執行 crontab /etc/crontab。假如是 vixie-cron,你要把 /etc/crontab 中的每一行標成註解。

原始碼 3.3: 註解 /etc/crontab 中每一行

# sed -i -e "s/^/#/" /etc/crontab

給予信任的使用者使用 cron 的權限

假如你想要 root 以外的使用者使用 cron 服務的權限,你會需要繼續讀下去。否則你可 以跳去下一節 排程 cron 要執行的程序

注意: 給另一個使用者使用 crontab 的權限並不會讓他以 root 身份執行排程的程序。如果你要 讓使用者可以編輯 root 的 crontab,你應該查詢 sudo

不管你使用什麼 cron 套件,當你想要允許使用者使用 crontab,他首先需要在 cron 群 組中。舉例來說,如果你想要將使用者 wepy 加到 cron 群組,你要執行:

原始碼 3.4: 把使用者加到 cron 群組中

# gpasswd -a wepy cron

假設你使用 Dcron,這就是你給使用者使用 cron 權限所需的工作了。接著可以繼續看 排程 cron 要執行的程序,其他的話請繼續閱讀下去。

如果是使用 Fcron,你要去編輯 /etc/fcron/fcron.deny/etc/fcron/fcron.allow。更安全的方法是先在 /etc/fcron/fcron.deny 中阻擋所有使用者,然後在 /etc/fcron/fcron.allow 中明確指定允許的使用者。

重要: 假如 /etc/fcron/fcron.allow 還有 /etc/fcron/fcron.deny 都不存在,所有在 cron 群組的使用者都可以使用 frontab。 fcron 預設的 fcron.allow允許所有在 cron 群組的使用者 使用 fcrontab。

原始碼 3.5: fcron.deny 中的設定

all

現在,假如有一個 wepy 使用者可以排程他自己的 cron 程序,我們依下面的設定 加到 /etc/fcron/fcron.allow 中。

原始碼 3.6: fcron.allow 中的設定

wepy

假如你使用 Vixie cron,你只需要編輯 /etc/cron.allow

重要: 相當重要的一點是如果只有 /etc/cron.allow 存在,那只有列在裡面的 cron 群組使用者可以使用,但是如果有一個空白的 /etc/cron.deny,那會 讓所有 cron 群組使用者都可以使用!如果你沒有 /etc/cron.allow, 不要留一個空白的 /etc/cron.deny

舉個例子,你想要允許 wepy 使用者使用,你需要依照下面把他加到 /etc/cron.allow

原始碼 3.7: /etc/cron.allow 中的設定

wepy

排程 cron 要執行的程序

編輯 crontab 的過程隨著套件不同而改變,但是他們都支援基本的指令集:新增,取代, 編輯,刪除還有列出排程程序的指令。下面幾行顯示對於每種套件如何執行這些指令。

版本 編輯 移除 新增 列出
dcron crontab -e crontab -d crontab file crontab -l
fcron fcrontab -e fcrontab -r fcrontab file fcrontab -l
vixie-cron crontab -e crontab -r crontab file crontab -l

注意: Fcron 也有一個指向 crontab 的符號連結。

在我們可以使用這些指令之前,你首先需要了解 crontab。crontab 中每一行需要指定五 個時間欄位,次序如下:分鐘(0-59),小時(0-23),日(1-31),月(1-12),最後是星期 (0-7,1 是星期一,0 和 7 是星期日)。星期還有月份可以用三個字母的縮寫來表示,如 mon,tue,jan,feb 等等。每個欄位可以指定一段範圍。(像是 1-5 或 mon-fri),以逗 號分隔的清單(例如 1,2,3 或 mon,tue,wed) 或是一段範圍加上間格 (譬如說 1-6/2 代表 1,3,5)。

這些聽起來有一點讓人困惑,看是看過幾個範例後,你會了解這並不會像聽起來這麼複雜。

原始碼 3.8: Examples

# 全年每分鐘執行 /bin/false
*     *     *     *     *        /bin/false  

# 在每個月的四號及星期一,二,三的 1:35 執行 /bin/false
35    1     4     *     mon-wed  /bin/false

# 在四月二日 22:25 執行 /bin/true
25    22    2     3     *        /bin/true

# 每個星期一,三,五的 2:00 執行 /bin/false
0     2     *     *     1-5/2    /bin/false

注意: 注意如何合併星期幾和幾號。如果只有一個有 * ,那另一個有優先權。而兩個都 * 代表 每天。

來測測我們剛學的,依照上面的步驟真的放幾個排程的程序進去。首先,建立一個叫 crons.cron 的檔案,內容看起來像這樣:

原始碼 3.9: 編輯 crons.cron

$ nano crons.cron
#Mins  Hours  Days   Months  Day of the week
10     3      1      1       *       /bin/echo "i don't really like cron"
30     16     *      1,2     *       /bin/echo "i like cron a little"
*      *      *      1-12/2  *       /bin/echo "i really like cron"

現在我們用上面表格中的 "新增指令" 把這個 crontab 加到系統中。

原始碼 3.10: 新的 crontab

# crontab crons.cron

注意: 除非你把他們的輸出轉向,你不會實際看到這些 echo 指令的輸出。

要檢查你排程的程序,我們使用表格中適當的 列出指令

原始碼 3.11: 列出程序

# crontab -l

你應該會看到類似 crons.cron 的輸出,如果沒有的話,或許你在輸入新的 crontab 時輸入錯誤的指令。

這個 crontab 會每隔一個月的每一天每分每秒顯示 "i really like cron"。明顯的除非 你超級喜歡 cron 你才會幹這種事。crontab 也會在一月及二月每天 16:30 顯示 "i like cron a little"。並且在一月一日 3:10 秀出 "i don't really like cron"。

假如你使用 Anacron,你要繼續閱讀這一節。否則你可以跳到下一節 編輯 crontabs

Anacron 使用者要去編輯 /etc/anacrontab。這個檔案有四個欄位:每次執 行間格幾天,Anacron 啟動後延遲多久執行,程序的名稱,要執行的指令。

舉例來說,要每隔五天,Anacron 啟動 10 分鐘後執行 echo "i like anacron", 你要輸入:

原始碼 3.12: /etc/anacrontab

5 10 wasting-time /bin/echo "i like anacron"

Anacron 在所有程序都完成後結束,所以如果我們要讓他每天檢查,會需要用 cron。下一 節最後面的指南會告訴你如何做。

編輯 crontabs

現在該醒醒了,你並不會想要系統每分鐘告訴你你多喜歡 cron。接下來我們要做的是,依 照上面的表格使用相對應的 移除指令 來移除 crontab。接著我們也會列出目前的 cron 程序,只是要確定這指令正常工作。

原始碼 3.13: 移除 crontab

# crontab -d
# crontab -l

你應該會在 crontab -l 的輸出中看到連一個 cron 程序都沒有。如果你的確看到 上面還有程序的話,這代表說移除失敗了,你要去確定你是否使用適合你 cron 套件的 移除指令

現在有一個空白的時間表,來放一些有用的東西到 root 的 crontab。大部分的人 會每個禮拜跑一次 updatedbslocate 正常工作。要把這放到 crontab, 先編輯 crons.cron 讓他看起來像這樣:

原始碼 3.14: 一個真實的 crontab

22 2 * * 1    /usr/bin/updatedb

這會讓 cron 在每個禮拜一的早上 2:22 執行 updatedb。你現在要依上面的表執行合適的 新增指令,然後再檢查列表。

原始碼 3.15: 列出 cron 程序

# crontab crons.cron
# crontab -l

假設說你想要在日行程中增加 emerge --sync。你可以先編輯 crons.cron,然後就如同之前說的,輸入 crontab crons.cron。或 者用合適的 編輯指令。這讓你可以在原來的檔案編輯使用者的 crontab,而不用 透過像是 crons.cron 的外部檔案。

原始碼 3.16: 原地編輯 crontab

# crontab -e

這會用一個編輯器開啟使用者的 crontab。我們想要每天 6:30 A.M. 執行 emerge --sync,所以看起來像這樣:

原始碼 3.17: 真實的 crontab

22 2 * * 1    /usr/bin/updatedb
30 6 * * *    /usr/bin/emerge --sync
(如果你使用 anacron,加上這行)
30 7 * * * 	  /usr/sbin/anacron -s

再一次,如我們之前做的,檢查 cron 程序列表倔定程序排程好了。如果都顯示再上面, 那全部都完成了。

4.  最後的提醒

排困解難

假如你碰到一些問題讓 cron 不能正常工作,你或許想要走一次快速檢查清單。

  • cron 在執行嗎?
    執行 ps ax | grep cron,確定有顯示出來!
  • cron 有正常工作嗎?
    試試: * * * * * /bin/echo "foobar" >> /file_you_own ,然後確定他有在工作。
  • 你的指令有在執行嗎?
    試試: * * * * * /bin/foobar > /file_you_own 2>&1,在 /file_you_own 中尋找錯誤
  • cron 有執行你的程序嗎?
    檢查 cron 紀錄檔找出錯誤,通常在 /var/log/cron.log/var/log/messages
  • 出現了 dead.letter?
    cron 通常會在有問題時寄給你一封信,檢查你的信箱並且尋找 ~/dead.letter。

記得,每一種 cron 套件都不同而且功能的差別也很大。記得依你用的套件,查詢 crontab,fcrontab,anacrontab 的手冊頁。

祝你好運!



列印

最後更新 2005年 7月 25日

這份文件的原始版本已不再被維護

大綱: 這分指南說明如何設定及使用 cron。

Eric Brown
Author

Xavier Neys
Editor

YiDa Chiang
Translator

Donate to support our development efforts.

Support OSL

Support OSL

Gentoo Centric Hosting: vr.org

VR Hosted

Tek Alchemy

Tek Alchemy

SevenL.net

SevenL.net

Global Netoptex Inc.

Global Netoptex Inc.

Bytemark

Bytemark

Copyright 2001-2008 Gentoo Foundation, Inc. Questions, Comments? Contact us.