概述
cron 是Linux 或者類 Unix 系統的作業調度程序。利用它,我們可以配置某些命令或者腳本,讓命令和腳本在某個設定的時間內周期性地運行。本文主要以描述了 CentOS 6的cron命令的詳細知識。
了解cron組件
cron程序由程序包cronie提供,我們可以通過rpm -qi cronie查看cronie的信息。
cron 的組件包括:
1.守護進程本身(crond);
所謂守護進程,即是不間斷運行在后臺的進程,它隨時監聽用戶的請求,并隨時響應并予以執行用戶的作業。crond的最小周期單位是1分鐘/次。
2. 一個用來添加、修改和刪除用戶配置文件的實用程序;
cron程序主要通過 crontab 命令 管理cron作業。一般來說,cron 配置文件或 cron 作業的列表被稱為 crontab 或 cron 時間表。為了避免混淆,本文將命令和作業分別以 crontab 命令 和crontab 作以區分。
雖然我們可以直接編輯配置文件,但限于crontab有固定格式,所以不建議用文本編輯器進行直接編輯。而應該使用 crontab 命令進行管理計劃任務。
3. 一組系統范圍的配置文件;
我們可以在三個位置定義與系統相關的 crontab 作業:/etc/crontab、/etc/cron.d 中的任何文件以及特殊目錄 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly。
-
主要的系統crontab是/etc/crontab。這個文件有獨特的語法(在下一節中討論),其中定義的每個作業根據它自己的時間表(比如每小時兩次或每天一次)作為指定的用戶運行。使用 /etc/crontab 調度各種管理和維護任務。
-
還
可以在 /etc/cron.d 目錄中維護一組 crontab。通過創建crontab,按照邏輯對屬于某一子系統的命令進行分組。/etc/cron.d
中的文件采用與 /etc/crontab 相同的語法,每個作業按照自己的時間表并作為特定的用戶運行。 -
還可以把 shell 腳本直接放在
/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 或 /etc/cron.monthly
目錄中,實現每小時、每天、每周或每月運行此腳本一次。放在這里的腳本作為超級用戶運行。
4. 一組針對特定用戶的配置文件;
針對用戶的 crontab 集合通常放在 /var/spool/cron/ 中,通常以用戶名做為文件名存放。同樣的,建議使用 crontab命令 創建
crontab 并提交文件。
5. 一個簡單的訪問控制設施。
分別使用訪問控制文件 /etc/cron.allow 和 /etc/cron.deny 允許或拒絕用戶訪問 cron。例如,如果某個用戶的作業可能會破壞系統的正常操作,就可以拒絕他訪問 cron。
crontab作業
crontab 是一個文本文件。它可以包含四種代碼行:空行、注釋、環境變量設置和作業命令。
空行和注釋
文件中的空行和多余的空格被忽略??招泻涂崭裼兄谔岣?crontab 的可讀性,使 crontab 組織有序。
還可以使用注釋對每個作業的時間表和用途加以說明。要想創建注釋,只需在一行的開頭加上一個井號(#)。
環境變量設置
cron 最終使用一個 shell 執行每個命令??梢酝ㄟ^環境變量修改或定制 shell 的行為。
在 crontab 中很容易設置 shell 環境變量。只需輸入 VARIABLE=value,把 VARIABLE 替換為變量名,把 value 替換為一個值。
cron 預定義了4個環境變量:
-
PATH 的默認值是 /sbin:/bin:/usr/sbin:/usr/bin。
-
SHELL 預設置為 /bin/bash。
-
HOME 設置為 crontab 所有者的主目錄,比如 /home/joe。
-
MAILTO 執行結果郵件發送給MAILTO指定的用戶。
要想修改這些默認值或設置任何變量,只需在 crontab 中設置適當的環境變量。
注意:crontab的任務環境PATH與用戶登錄的PATH很多時候不完全相同,所以編寫crontab執行命令或腳本時,建議使用命令的絕對路徑;也可以修改crontab的PATH變量。
作業命令
crontab的作業命令由單行固定格式的文本構成。一般可以分為3個部分:
-
執行頻率,定義周期性時間;以空格分隔的5個字段,分別代表:分鐘,小時,日期,月份,周。
-
crontab所有者,運行任務的用戶身份;系統級crontab必須有此字段,用戶級(/var/spool/cron/*)的crontab則無需此字段。因此,是否有用戶名是系統 crontab 和用戶 crontab 之間的惟一差異。
-
執行命令或腳本。
crontab執行頻率支持多種設置,可以靈活的允許以多種方式運行作業,比如每分鐘或在特定日期的特定時間。
表1. cron 作業執行頻率選項
位置 | 字段 | 值 | 說明 |
---|---|---|---|
1 | 分鐘 |
0-59 | |
2 | 小時 | 0-23 | 0到23的24小時計時法 |
3 | 日期 | 1-31 | 與分和小時不同,月中日不是從0開始的。 |
4 | 月份 | 1-12 | 月份也不是從0開始的。也可以使用月份英文名的前三個字母,比如 jan 或 may。 |
5 | 周 | 0-7 |
0和7 都代表星期日。還可以使用英文名稱的前三個字母,比如 sun、mon、tue… 注意: A.一般定義了具體的月和日后,不建議定義周,例如:* * 1 2 3,表示2月1日并且是周3的每分鐘,符合條件的那一天也許百年不遇; B.定義了具體日期和周,則是或關系,例如:* * 1 * 3,表示每個月的1日或者每個月的周三 |
表2. crontab每個時間字段表示法:
序號 | 值 | 說明 |
1 | N | 特定值,給定時間點郵箱取值范圍內的值。(N表示數字) |
2 | * | 給定時間點上有效取值范圍內的所有值,表示為“每…” |
3 | , | 離散取值 |
4 | – | 連續取值 |
5 | / | 在指定時間范圍上,定義步長 |
我們通過以下示例說明周期表示法:
表3. 示例說明
分 | 小時 | 日期 | 月份 | 周 | 說明 |
* | * | * | * | * | 每分鐘執行 |
0 | 1 | 15 | 1,3,5,7,9,11 | * | 在 1、3、5、7、9 和 11 月的 15 日的 1 a.m. 運行命令。在指定列表時,不要在逗號后面加空格。 |
0-59/15 | * | * | * | * | 每 15 分鐘運行命令一次。0-59/15等同于*/15 |
30 | * | * | * | wed,fri | 星期三和星期五每小時的 30 分時執行命令一次。(在列表中可以使用日和月份的名稱,但是在范圍中不可以)。 |
0,30 | 0-5,17-23 | * | * | * | 在(0點-5點, 以及 17點-23點之間)整點時和 30 分時運行命令。 |
0 | 0 | 1 | 1 | * | 在每年 1 月 1 日0:00執行命令一次。 |
0 | 0 | * | * | 0 | 在每個星期日午夜運行命令。這相當于每周一次。 |
30 | 0 | 10,20,30 | * | 6 | 每星期六和每月的 10、20 和 30 日(二月除外)的 00:30 運行命令。 |
前面提到crond的最小周期單位是1分鐘/次。如果我們需要運行的周期是以秒或更小單位時候,要怎么辦呢?
這里建議方法是:以腳本編寫執行命令,通過循環語句,配合sleep、usleep,達到秒級甚至微秒的周期性任務任務。
crontab命令
crontab命令本質上是調用文本編輯器進行編輯 crontab ,并在修改保存時進行語法格式檢查。
crontab的語法格式
crontab [-u user] file crontab [-u user] [ -e | -l | -r ]
crontab的常用選項
-e 編輯用戶的 crontab; -l 列出用戶的 crontab; -r 刪除用戶的 crontab;
crontab命令使用受權限控制。
crontab權限管理
cront通過/etc/cront.{allow,deny}兩個文件,進行權限管理,控制用戶是否能執行cront任務:
-
/etc/cront.allow 存在,則/etc/cront.deny不生效,只有文件定義的使用者才能使用 crontab 命令 ,沒有在這個文件中的使用者則不能使用,即使沒有寫在cront.deny 當中;
-
/etc/cront.allow 不存在, /etc/cront.deny 生效, cront.deny文件定義的使用者不能使用 cront ,而沒有在這個 cront.deny 文件中的使用者則可使用 crontab 命令;
-
如果兩個文件都不存在,只有 root 可以使用 crontab 命令 。
即白名單優先管理權限,默認沒有/etc/cron.allow文件,只要創建,僅列出的允許,其他都拒絕
原創文章,作者:昭其,如若轉載,請注明出處:http://www.www58058.com/47423
寫的很詳細,特別時間格式,很多時候,定時計劃任務出錯就是時間定義出錯。