更多精彩文章:https://deepzz.com
cron 是什么流炕?這是一個 unix 系統(tǒng)內(nèi)置的定時執(zhí)行任務(wù)的工具,最小精確到一分鐘仅胞。它的實現(xiàn)有很多版本每辟,不同版本間有些許的功能差異。與它相關(guān)的有兩個工具:crond 和 crontab干旧。crond 就是 cron 在系統(tǒng)內(nèi)的宿主程序影兽,crontab 是管理 cron 任務(wù)的管理工具。
下面介紹 cron 相關(guān)的使用莱革。
概覽
在給 cron 添加任務(wù)記錄之前需要先了解它的規(guī)矩:
┌───────────── 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 個時間點 + 執(zhí)行的命令峻堰。其中 *
是特殊的,它表示任何情況均匹配盅视。
我們來理解幾條記錄:
# 在每個小時的第一分鐘執(zhí)行 `echo "hello" >> a.txt`捐名。
1 * * * * echo "hello" >> a.txt
# 每 2 分鐘執(zhí)行一次 `echo "hello world" >> a.txt`。
*/2 * * * * echo "hello world" >> a.txt
# 在每個星期 6 的 23 點 45 分執(zhí)行這個腳本闹击。
45 23 * * 6 /home/oracle/scripts/export_dump.sh
如何添加任務(wù)記錄镶蹋?你可以通過 crontab -e
修改添加。crontab -h
查看幫助。
權(quán)限
有兩個文件:
-
/etc/cron.allow
贺归,如果此文件存在淆两,它必須包含你使用 cron 作業(yè)的用戶名。 -
/etc/cron.deny
拂酣,如果 cron.allow 文件不存在秋冰,但是/etc/cron.deny
文件確實存在,那么要使用 cron 作業(yè)婶熬,不能列在/etc/cron.deny
文件中剑勾。
表達式
上面已經(jīng)見過 cron 的任務(wù)記錄的形式,即表達式赵颅。下面我們具體的去理解表達式虽另。
字段 | 必須 | 值范圍 | 允許特殊字符 | 備注 |
---|---|---|---|---|
分鐘 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
表示星期一到星期五吼过。
百分號(%)
執(zhí)行命令中的百分號,除非用反斜杠(\)進行轉(zhuǎn)義苛谷,否則將更改為換行符辅鲸,并將第一個 % 之后的所有數(shù)據(jù)作為標準輸入發(fā)送到命令格郁。
下面這些是非標準字符,可能在僅存在于某些 cron 中独悴。
L
L
代表 “最后”例书,當在星期幾字段中使用時,它可以指定特定月份的 “最后一個星期五”(5L)刻炒,在 “月份” 字段中决采,它指定了該月的最后一天。
W
W
可用于月份坟奥,用于指定最近給定日期的工作日(星期一到星期五)树瞭。如,如果要將 “15W” 指定為月日期字段的值爱谁,則意思是:“離 15 號最近的工作日”晒喷。所以,如果 15 日是星期六访敌,觸發(fā)器將在 14 日星期五觸發(fā)凉敲。如果 15 日是星期天,觸發(fā)器將在 16 日星期一觸發(fā)。如果 15 日是星期二爷抓,那么它將在 15 日當天觸發(fā)势决。但是,如果您指定 “1W” 作為月日的值蓝撇,而該天是星期六果复,則觸發(fā)器將在 3 天后的星期一觸發(fā),因為它不會在一個月的邊界上跳轉(zhuǎn)唉地。只有當日期是單日据悔,而不是范圍或天數(shù)時,才能指定 “W” 字符耘沼。
哈希(#)
#
可用于星期幾字段极颓,并且后面必須跟 1-5 之間的數(shù)字。它允許你指定一個給定月份的 “第二個星期五”群嗤。如菠隆,“4#3” 代表哪個月的第 3 個星期四。
/
與范圍組合指定步進值狂秘。如分鐘字段 */5
表示每 5 分鐘骇径。
H(H)
H
用于 Jenkins 軟件。20 * * * *
代表每個小時的第 20 分鐘者春,H * * * *
指示任務(wù)每小時執(zhí)行一次未指定的但不變的時間破衔。這允許隨著時間的推移擴展任務(wù)。
crontab
crontab 是管理任務(wù)記錄的工具钱烟。我們可以容易的到 /etc
下看到 cron.d
晰筛、cron.daily
、cron.weekly
拴袭、cron.monthly
读第、cron.hourly
、crontab
拥刻、cron.deny
等文件怜瞒。
看一下 crontab 文件的內(nèi)容:
$ 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
大概會有上面的內(nèi)容。這個相當于內(nèi)容是空的般哼,我們需要添加:
# 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
這樣吴汪,一般的如 每小時、每天蒸眠、每個星期漾橙、每個月執(zhí)行的任務(wù)都覆蓋到了。上面的語句的意思是:到點觸發(fā)執(zhí)行相關(guān)目錄內(nèi)的腳本黔宛。