定時任務(cron job)被用來安排那些需要被週期性執行的命令。利用它,你可以設定某些指令或腳本,讓它們在某個設定的時間內週期性地運作。 cron 是 Linux 或類別 Unix 系統中最實用的工具之一。 cron 服務(守護程式)在系統背景執行,並且會持續檢查 /etc/crontab 檔案和 /etc/cron.*/目錄。它同樣也會檢查 /var/spool/cron/ 目錄。
crontab 指令
crontab 是用來安裝、解除安裝或列出定時任務清單的指令。 cron 設定檔則用於驅動 Vixie Cron 的 cron(8) 守護程式。每個使用者都可以擁有自己的 crontab 文件,雖然這些文件都位於 /var/spool/cron/crontabs 目錄中,但這並不意味著你可以直接編輯它們。你需要透過 crontab 指令來編輯或設定自己的定時任務。
定時設定檔的類型
設定檔分為以下不同的類型:
UNIX 或 Linux 的系統級 crontab : 此類型通常由那些需要 root 或類似權限的系統服務和重要任務使用。第六個欄位(請參閱下方的欄位介紹)為使用者名,用來指定此指令以哪個使用者身分來執行。如此一來,系統的 crontab 就能夠以任意使用者的身分來執行操作。
用戶的 crontab: 使用者可以使用 crontab 指令來安裝屬於他們自己的定時任務。 第六個欄位為需要執行的指令, 所有的指令都會以建立該 crontab 任務的使用者的身分執行。
注意: 這種問答形式的 Cron 實作由 Paul Vixie 編寫而成,並且被包含在許多 Linux 發行版本和類 Unix 系統(如廣受歡迎的第四版 BSD)中。它的語法被各種 crond 的實作所相容。
那我該如何安裝、建立或編輯我自己的定時任務呢?
要編輯你的crontab 文件,需要在Linux 或Unix 的shell 提示符後鍵入以下指令:
$ crontab -e
crontab 語法(欄位介紹)
為:41555 /path/to/command arg1 arg2或
其中:
小時(0-23)
第3個欄位:日期(0-31)
第4個欄位:月份(0-12 [12 代表December])
第5個欄位:一週當中的某天( 0-7 [7 或0 代表星期日])
/path/to/command – 計劃執行的腳本或命令的名稱
便於記憶的格式:
* * * * * 要執行的命令
* * * * * 要執行的命令
*-- -------------| | | | |
| | | | ---- 週當中的某天 (0 - 7) (週日為 0 或 7)
| | -(週日為 0 或 7)
| | - ----- 月份 (1 - 12)| | -------- 一月當中的某天 (1 - 31)| ---------- 小時 (0 - 23)
------------ 分鐘 (0 - 59)
簡單的crontab 範例:
### 每隔 5 分鐘執行一次 backupscript 腳本 ##*/5 * c /backupscript.sh### 每天的凌晨 1 點運行 backupscript 腳本 ##0 1 * * * /root/backupscript.sh### 每月的第一個凌晨 3:15 運行* /root/backupscript.sh
如何使用運算符
運算子允許你為一個欄位指定多個值,這裡有三個運算子可供使用:
星號(*) : 此運算子為欄位指定所有可用的值。舉個例子,在小時欄位中,一個星號等同於每個小時;在月份欄位中,一個星號則等同於每月。
逗號(,) : 這個運算子指定了一個包含多個值的列表,例如:1,5,10,15,20,25.
橫槓(-) : 此運算子指定了一個值的範圍,例如:5-15 ,等同於使用逗號運算元鍵入的5,6,7,8,9,…,13,14,15。
分隔符號 (/) : 此運算子指定了一個步進值,例如: 0-23/ 可以用於小時欄位來指定某個指令每小時執行一次。步進值也可以跟在星號運算子後邊,如果你希望命令列每 2 小時執行一次,則可以使用 */2。
如何停用郵件輸出
預設情況下,某個指令或腳本的輸出內容(如果有的話)會傳送到你的本地郵件帳號。若想停止接收crontab 發送的郵件,需要新增>/dev/null 2>&1 這段內容到執行的指令的後面,例如:
0 3 * * * /root/backup.sh >/dev/null 2 >&1
如果想將輸出內容送到特定的郵件帳號中,比如說vivek@nixcraft.in 這個信箱, 則你需要像下面這樣定義一個MAILTO 變數:
MAILTO="vivek@nixcraft.in" 0 3 * * * /root/backup.sh >/dev/null 2>&1
存取「已停用Crontab 指令的郵件提示」 查看更多資訊。
任務:列出你所有的定時任務
鍵入以下命令:
# crontab -l# crontab -u username -l
要刪除所有的定時任務,可以使用以下命令刪除目前定時任務crontab -r
### 刪除某用戶名下的定時任務,此指令需以 root 使用者身分執行crontab -r -u username
使用特殊字串來節省時間
你可以使用下列時間8 個特殊字串中的其中一個替代頭五個字段,這樣不但可以節省你的時間,還可以提高可讀性。
範例:
每小時執行一次ntpdate 指令
@hourly /path/to/ntpdate
@hourly /path/to/ntpdate
/etc/crontab 是系統的crontab 檔案。通常只被 root 使用者或守護程式用來設定係統層級的任務。每個單獨的使用者必須像上面介紹的那樣使用 crontab 命令來安裝和編輯自己的任務。 /var/spool/cron/ 或 /var/cron/tabs/ 目錄存放了個人使用者的 crontab 文件,它應該備份在使用者的家目錄當中。
理解預設的 /etc/crontab 檔案
典型的 /etc/crontab 檔案內容是這樣的:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/# run-parts01 * * * * 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
首先,環境變數必須被定義。如果 SHELL 行被忽略,cron 會使用預設的 sh shell。如果 PATH 變數被忽略,就沒有預設的搜尋路徑,所有的檔案都需要使用絕對路徑來定位。如果 HOME 變數被忽略,cron 會使用呼叫者(使用者)的家目錄來替代。
另外,cron 會讀取 /etc/cron.d/目錄中的檔案。通常情況下,像 sa-update 或 sysstat 這樣的系統守護程式會將他們的定時任務存放在此。身為 root 用戶或超級用戶,你可以使用以下目錄來設定你的定時任務。你可以直接將腳本放到這裡。 run-parts指令會透過 /etc/crontab 檔案來執行位於某個目錄中的腳本或程式。
備份定時任務
# crontab -l > /path/to/file# crontab -u user -l > /path/to/file