什么是 cron?利用 cron 定時執行任務

更多精彩文章:https://deepzz.com

cron 是什么?這是一個 unix 系統內置的定時執行任務的工具,最小精確到一分鐘。它的實現有很多版本,不同版本間有些許的功能差異。與它相關的有兩個工具:crond 和 crontab。crond 就是 cron 在系統內的宿主程序,crontab 是管理 cron 任務的管理工具。

下面介紹 cron 相關的使用。

概覽

在給 cron 添加任務記錄之前需要先了解它的規矩:

┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of month (1 - 31)
│ │ │ ┌───────────── month (1 - 12)
│ │ │ │ ┌───────────── day of week (0 - 6) (Sunday to Saturday;
│ │ │ │ │                                       7 is also Sunday on some systems)
│ │ │ │ │
│ │ │ │ │
* * * * *  command to execute

每條記錄一般是:5 個時間點 + 執行的命令。其中 * 是特殊的,它表示任何情況均匹配。

我們來理解幾條記錄:

# 在每個小時的第一分鐘執行 `echo "hello" >> a.txt`。
1 * * * * echo "hello" >> a.txt

# 每 2 分鐘執行一次 `echo "hello world" >> a.txt`。
*/2 * * * * echo "hello world" >> a.txt

# 在每個星期 6 的 23 點 45 分執行這個腳本。
45  23 * * 6 /home/oracle/scripts/export_dump.sh

如何添加任務記錄?你可以通過 crontab -e 修改添加。crontab -h 查看幫助。

權限

有兩個文件:

  • /etc/cron.allow,如果此文件存在,它必須包含你使用 cron 作業的用戶名。
  • /etc/cron.deny,如果 cron.allow 文件不存在,但是 /etc/cron.deny 文件確實存在,那么要使用 cron 作業,不能列在 /etc/cron.deny 文件中。

表達式

上面已經見過 cron 的任務記錄的形式,即表達式。下面我們具體的去理解表達式。

字段 必須 值范圍 允許特殊字符 備注
分鐘 Minutes 0 - 59 * , - -
小時 Hours 0 - 23 * , - -
幾號 Day of month 1 - 31 * , - ? L W -
月份 Month 1 - 12 或 JAN - DEC * , - -
星期幾 Day of week 0 - 6 或 SUN -SAT * , - ? L # -

逗號(,)

用于分隔并列時間,如,在第五個字段(星期幾)中使用 MON,WED,FRI 表示星期一,星期三和星期五。

連接符(-)

指定范圍,如,MON-WED 表示星期一到星期五。

百分號(%)

執行命令中的百分號,除非用反斜杠(\)進行轉義,否則將更改為換行符,并將第一個 % 之后的所有數據作為標準輸入發送到命令。

下面這些是非標準字符,可能在僅存在于某些 cron 中。

L

L 代表 “最后”,當在星期幾字段中使用時,它可以指定特定月份的 “最后一個星期五”(5L),在 “月份” 字段中,它指定了該月的最后一天。

W

W 可用于月份,用于指定最近給定日期的工作日(星期一到星期五)。如,如果要將 “15W” 指定為月日期字段的值,則意思是:“離 15 號最近的工作日”。所以,如果 15 日是星期六,觸發器將在 14 日星期五觸發。如果 15 日是星期天,觸發器將在 16 日星期一觸發。如果 15 日是星期二,那么它將在 15 日當天觸發。但是,如果您指定 “1W” 作為月日的值,而該天是星期六,則觸發器將在 3 天后的星期一觸發,因為它不會在一個月的邊界上跳轉。只有當日期是單日,而不是范圍或天數時,才能指定 “W” 字符。

哈希(#)

# 可用于星期幾字段,并且后面必須跟 1-5 之間的數字。它允許你指定一個給定月份的 “第二個星期五”。如,“4#3” 代表哪個月的第 3 個星期四。

/

與范圍組合指定步進值。如分鐘字段 */5 表示每 5 分鐘。

H(H)

H 用于 Jenkins 軟件。20 * * * * 代表每個小時的第 20 分鐘,H * * * * 指示任務每小時執行一次未指定的但不變的時間。這允許隨著時間的推移擴展任務。

crontab

crontab 是管理任務記錄的工具。我們可以容易的到 /etc 下看到 cron.dcron.dailycron.weeklycron.monthlycron.hourlycrontabcron.deny 等文件。

看一下 crontab 文件的內容:

$ cat crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

大概會有上面的內容。這個相當于內容是空的,我們需要添加:

# 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

這樣,一般的如 每小時、每天、每個星期、每個月執行的任務都覆蓋到了。上面的語句的意思是:到點觸發執行相關目錄內的腳本。

參考文檔

[1] https://en.wikipedia.org/wiki/Cron

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Linux定時任務Crontab命令詳解 linux 系統則是由 cron (crond) 這個系統服務來控制的。...
    孫燕超閱讀 1,839評論 0 4
  • Liunx定時任務 crontab(持續運行) cron守護進程 cron服務 systemctl start ...
    liudongdong閱讀 703評論 0 5
  • 前一天學習了 at 命令是針對僅運行一次的任務,循環運行的例行性計劃任務,linux系統則是由 cron (cro...
    Zcclucky閱讀 592評論 0 0
  • Linux定時任務Crontab命令詳解linux 系統則是由 cron (crond) 這個系統服務來控制的。L...
    時待吾閱讀 409評論 0 0
  • 話說四川一座大學,位與城市郊外,平時就流傳著不少令人奇怪的不可思議的故事。有一個女生寢室,住著7個女生,平日里相安...
    故鄉大閱讀 216評論 1 0