Linux/UNIX 定時任務 cron 詳解
| 2016-06-28 15:54 評論: 7 收藏: 5
導言
定時任務 被用於安排那些需要被週期性執行的命令。利用它,你可以配置某些命令或者指令碼,讓它們在某個設定的時間內週期性地執行。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
語法(欄位介紹)
語法為:
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
相關文章
- linux定時任務cron配置Linux
- 排查linux 定時任務cron crontabLinux
- Golang——Cron 定時任務Golang
- openshift 新增cron定時任務
- Linux定時任務系統 Cron 入門(轉)Linux
- Linux Crontab 定時任務 命令詳解Linux
- Laravel Cron 定時任務 “跳坑” 點Laravel
- Oracle 定時任務詳解Oracle
- 定時任務crontab 詳解
- linux 定時任務 crontab 詳細解釋!Linux
- Crontab 定時任務命令詳解
- GO的定時器Timer 和定時任務cronGo定時器
- 在 Linux 中安全且輕鬆地管理 Cron 定時任務Linux
- Linux作業系統定時任務系統 Cron 入門Linux作業系統
- CentOS Linux使用crontab執行定時任務詳解CentOSLinux
- java 定時任務 quartz 時間表示式Cron總結Javaquartz
- 定時任務@Scheduled引數詳解
- Java定時任務排程詳解Java
- crontab命令簡介 linux定時設定 Cron實現自動任務 (轉)Linux
- ubuntu上使用cron執行定時任務計劃Ubuntu
- linux下定時任務 crontab詳解Linux
- 【親測有效】【定時】定時任務 @Scheduled(cron = "0 0 21 * * ?") 【Scheduled失效】
- Linux下的crontab定時執行任務命令詳解Linux
- Quartz定時任務框架(二) Quartz詳解quartz框架
- Oracle定時任務(DBMS_Job)詳解Oracle
- Linux | 定時任務Linux
- Linux 定時任務Linux
- Linux at 定時任務Linux
- Linux定時任務Linux
- 擺脫定時任務的cron表示式的困擾
- 定時任務報警通知解決方案詳解
- Linux crontab 定時任務Linux
- Linux 定時任務(crontab)Linux
- LINUX 定時任務命令Linux
- Linux - crontab(定時任務)Linux
- Linux 中怎麼設定計劃任務:cron 與 anacronLinux
- 如何在Linux中加入cron任務Linux
- linux定時任務的設定Linux