Linux中國

Linux/UNIX 定時任務 cron 詳解

導言

定時任務 cron job 被用於安排那些需要被周期性執行的命令。利用它,你可以配置某些命令或者腳本,讓它們在某個設定的時間內周期性地運行。cron 是 Linux 或者類 Unix 系統中最為實用的工具之一。cron 服務(守護進程)在系統後台運行,並且會持續地檢查 /etc/crontab 文件和 /etc/cron.*/目錄。它同樣也會檢查 /var/spool/cron/ 目錄。

crontab 命令

crontab 是用來安裝、卸載或者列出定時任務列表的命令。cron 配置文件則用於驅動 Vixie Croncron(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 語法(欄位介紹)

語法為:

1 2 3 4 5 /path/to/command arg1 arg2

或者

1 2 3 4 5 /root/ntp_sync.sh

其中:

  • 第1個欄位:分鐘 (0-59)
  • 第2個欄位:小時 (0-23)
  • 第3個欄位:日期 (1-31)
  • 第4個欄位:月份 (1-12 [12 代表 December])
  • 第5個欄位:一周當中的某天 (0-7 [7 或 0 代表星期天])
  • /path/to/command - 計劃執行的腳本或命令的名稱

便於記憶的格式:

* * * * * 要執行的命令
-------------| | | | |
| | | | ---- 周當中的某天 (0 - 7) (周日為 0 或 7)
| | | ------ 月份 (1 - 12)
| | -------- 一月當中的某天 (1 - 31)
| ---------- 小時 (0 - 23)
------------ 分鐘 (0 - 59)

簡單的 crontab 示例:

### 每隔 5 分鐘運行一次 backupscript 腳本 ##
*/5 * * * * /root/backupscript.sh

### 每天的凌晨 1 點運行 backupscript 腳本 ##
0 1 * * * /root/backupscript.sh

### 每月的第一個凌晨 3:15 運行 backupscript 腳本 ##
15 3 1 * * /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 個特殊字元串中的其中一個替代頭五個欄位,這樣不但可以節省你的時間,還可以提高可讀性。

特殊字元 含義
@reboot 在每次啟動時運行一次
@yearly 每年運行一次,等同於 「0 0 1 1 *」.
@annually (同 @yearly)
@monthly 每月運行一次, 等同於 「0 0 1 」.
@weekly 每周運行一次, 等同於 「0 0 0」.
@daily 每天運行一次, 等同於 「0 0 *」.
@midnight (同 @daily)
@hourly 每小時運行一次, 等同於 「0 」.

示例:

每小時運行一次 ntpdate 命令

@hourly /path/to/ntpdate

關於 /etc/crontab 文件和 /etc/cron.d/* 目錄的更多內容

/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-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

首先,環境變數必須被定義。如果 SHELL 行被忽略,cron 會使用默認的 sh shell。如果 PATH 變數被忽略,就沒有默認的搜索路徑,所有的文件都需要使用絕對路徑來定位。如果 HOME 變數被忽略,cron 會使用調用者(用戶)的家目錄替代。

另外,cron 會讀取 /etc/cron.d/目錄中的文件。通常情況下,像 sa-update 或者 sysstat 這樣的系統守護進程會將他們的定時任務存放在此處。作為 root 用戶或者超級用戶,你可以使用以下目錄來配置你的定時任務。你可以直接將腳本放到這裡。run-parts命令會通過 /etc/crontab 文件來運行位於某個目錄中的腳本或者程序。

目錄 描述
/etc/cron.d/ 將所有的腳本文件放在此處,並從 /etc/crontab 文件中調用它們。
/etc/cron.daily/ 運行需要 每天 運行一次的腳本
/etc/cron.hourly/ 運行需要 每小時 運行一次的腳本
/etc/cron.monthly/ 運行需要 每月 運行一次的腳本
/etc/cron.weekly/ 運行需要 每周 運行一次的腳本

備份定時任務

# crontab -l > /path/to/file

# crontab -u user -l > /path/to/file

via: https://www.unixmen.com/add-cron-jobs-linux-unix/

作者:Duy NguyenViet 譯者:mr-ping 校對:FSSlc

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國