一、Crontab
Crontab命令用于設(shè)置周期性被執(zhí)行的指令。該命令從標(biāo)準(zhǔn)輸入設(shè)備讀取指令,并將其存放于“crontab”文件中,以供之后讀取和執(zhí)行。
可以使用Crontab定時處理離線任務(wù),比如每天凌晨2點更新數(shù)據(jù)等,經(jīng)常用于系統(tǒng)任務(wù)調(diào)度。
1.1 服務(wù)啟動和關(guān)閉
一般Linux系統(tǒng)中都會裝有Crontab,如果沒有安裝可以使用包管理工具安裝:
yum -y install vixie-cronyum -y install crontabs
Crontab服務(wù)的啟動和關(guān)閉命令如下:
service crond start
# 啟動服務(wù)
service crond stop
# 關(guān)閉服務(wù)
service crond restart
# 重啟服務(wù)
service crond reload
# 重新載入配置
service crond status
# 查看crontab服務(wù)狀態(tài)
1.2 任務(wù)調(diào)度全局配置
crontab全局任務(wù)調(diào)度配置在如下的目錄:
cron.d/ cron.daily/ cron.deny cron.hourly/ cron.monthly/ crontab cron.weekly/
-
cron.daily是每天執(zhí)行一次的job
-
cron.weekly是每個星期執(zhí)行一次的job
-
cron.monthly是每月執(zhí)行一次的job
-
cron.hourly是每個小時執(zhí)行一次的job
-
cron.d是系統(tǒng)自動定期需要做的任務(wù)
-
crontab是設(shè)定定時任務(wù)執(zhí)行文件
-
cron.deny文件就是用于控制不讓哪些用戶使用Crontab的功能
1.3 用戶配置文件
每個用戶都有自己的crontab配置文件,使用crontab -e命令進(jìn)行編輯。保存后系統(tǒng)會自動存放與/var/spool/cron/目錄中,文件以用戶名命名。
linux的crontab服務(wù)每隔一分鐘去讀取一次/var/spool/cron,/etc/crontab,/etc/cron.d下面所有的內(nèi)容,crontab命令一覽:
-
crontab -e: 編輯當(dāng)前用戶的定時任務(wù)列表
-
crontab -l: 查看當(dāng)前用戶的定時任務(wù)列表
-
crontab -r: 刪除當(dāng)前用戶的定時任務(wù)列表
1.4 crontab定時任務(wù)格式
crontab每一條記錄為一個定時任務(wù),定時人遵循相應(yīng)的定義規(guī)則。
其中前面的6個星號表示的含義如下:
內(nèi)容含義說明:
項目 | 含義 | 范圍 |
---|---|---|
第一個”*“ | 一小時當(dāng)中的第幾分鐘 | 0-59 |
第二個”*“ | 一天當(dāng)中的第幾小時 | 0-23 |
第三個”*“ | 一個月當(dāng)中的第幾天 | 1-31 |
第四個”*“ | 一年當(dāng)中的第幾月 | 1-12 |
第五個”*“ | 一周當(dāng)中的星期幾 | 0-7(0和7都代表星期日) |
第六個command | 要執(zhí)行的命令 | 可以是系統(tǒng)命令,也可以是自己編寫的腳本文件 |
每一個星號部分可用下面的特殊符號:
特殊字符 | 代表意義 |
---|---|
* | 代表任何時刻都接受的意思!舉例來說,范例一內(nèi)那個日、月、周都是 * ,就代表著 **不論何月、何日的禮拜幾的 12:00 都運行后續(xù)命令 ** 的意思! |
, | 代表分隔時段的意思。舉例來說,如果要下達(dá)的工作是 3:00 與 6:00 時,就會是:0 3,6 * * * command 時間參數(shù)還是有五欄,不過第二欄是 3,6 ,代表 3 與 6 都適用?。ú荒芗涌崭瘢?/td> |
- | 代表一段時間范圍內(nèi),舉例來說, 8 點到 12 點之間的每小時的 20 分都進(jìn)行一項工作:20 8-12 * * * command 仔細(xì)看到第二欄變成 8-12 喔!代表 8,9,10,11,12 都適用的意思! |
/n | 那個 n 代表數(shù)字,亦即是『每隔 n 單位間隔』的意思,例如每五分鐘進(jìn)行一次,則:*/5 * * * * command 很簡單吧!用 * 與 /5 來搭配,也可以寫成 0-59/5 ,相同意思! |
1.5 Crontab命令
1.5.1 命令格式
crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
1.5.2 命令功能
通過crontab 命令,我們可以在固定的間隔時間執(zhí)行指定的系統(tǒng)指令或 shell script腳本。時間間隔的單位可以是分鐘、小時、日、月、周及以上的任意組合。這個命令非常適合周期性的日志分析或數(shù)據(jù)備份等工作。
1.5.3 命令參數(shù)
-u user:用來設(shè)定某個用戶的crontab服務(wù),例如,“-u ixdba”表示設(shè)定ixdba用戶的crontab服務(wù),此參數(shù)一般有root用戶來運行。
file:file是命令文件的名字,表示將file做為crontab的任務(wù)列表文件并載入crontab。如果在命令行中沒有指定這個文件,crontab命令將接受標(biāo)準(zhǔn)輸入(鍵盤)上鍵入的命令,并將它們載入crontab。
-e:編輯某個用戶的crontab文件內(nèi)容。如果不指定用戶,則表示編輯當(dāng)前用戶的crontab文件。
-l:顯示某個用戶的crontab文件內(nèi)容,如果不指定用戶,則表示顯示當(dāng)前用戶的crontab文件內(nèi)容。
-r:從/var/spool/cron目錄中刪除某個用戶的crontab文件,如果不指定用戶,則默認(rèn)刪除當(dāng)前用戶的crontab文件。
-i:在刪除用戶的crontab文件時給確認(rèn)提示。
二、crontab定時任務(wù)實例
2.1 時間頻次示例
注意,一般最好不要同時采用幾號和每周幾,可能會出現(xiàn)混淆;
時間表達(dá)式示例:
時間 | 含義 |
---|---|
10 * * * * 命令 | 每小時的第10分鐘執(zhí)行一次命令 |
45 22 * * * 命令 | 在22點45分執(zhí)行命令 |
0 17 * * 1 命令 | 每周1的17點0分執(zhí)行命令 |
0 5 1,15 * * 命令 | 每月1日和15日的凌晨5點0分執(zhí)行命令 |
40 4 * * 1-5 命令 | 每周一到周五的凌晨4點40分執(zhí)行命令 |
*/10 4 * * * 命令 | 每天的凌晨4點,每隔10分鐘執(zhí)行一次命令 |
0 0 1,15 * 1 命令 | 每月1日和15日,每周1的0點0分都會執(zhí)行命令。 日和星期不是并且的關(guān)系,是或者的關(guān)系。 |
0 */10 * * * /usr/bin/curl http://www.baidu.com | 每10分鐘定時請求一個地址 |
10 14 1 * * sh test.sh | 每個月的1號 14:10 運行 |
*/1 * * * * sh test.sh | 每分鐘運行一次命令 |
59 23 * * 1,2,3,4,5 sh test.sh | 每個工作日23:59都進(jìn)行備份作業(yè)。 |
59 23 * * 1-5 sh test.sh | 每個工作日23:59都進(jìn)行備份作業(yè)。 |
10 0 * * * sh test.sh | 在 凌晨00:10運行 |
2.2 輸入輸出重定向
在上面更新數(shù)據(jù)定時任務(wù)的實例中,如果執(zhí)行update.sh的時候有錯誤信息輸出,會輸出到哪兒呢?
在沒有配置輸出重定向的時候,定時任務(wù)會見錯誤輸出到下面的文件:/var/log/mail/{$user},這是很不好的,我們往往需要把不同的腳本輸出到不同的日志文件,方便查看腳本的執(zhí)行情況,這個時候需要使用輸出重定向。
58 23 * * * sh /home/work/update.sh >> /home/work/log/update.log 2>&1
Linux中使用0-3作為文件描述符來表示標(biāo)準(zhǔn)流。
名稱 | 類型 | 文件描述符 | 操作 |
---|---|---|---|
stdin 標(biāo)準(zhǔn)輸入 | standard input | 0 | <,<< |
stdout 標(biāo)準(zhǔn)輸出 | standard output | 1 | >,>> |
stderr 標(biāo)準(zhǔn)錯誤輸出 | standard error output | 2 | 2>,2>> |
在上面的定時任務(wù)腳本中,update.sh后面的>>表示將輸出追加到update.log文件中,2>&1表示標(biāo)準(zhǔn)錯誤輸出重定向等同于標(biāo)準(zhǔn)輸出。
正確、錯誤日志的輸出是否寫入到文件方法:
- 不輸出任何內(nèi)容(建議使用方法一)
*/1 * * * * /root/XXXX.sh >/dev/null 2>&1
或
*/1 * * * * /root/XXXX.sh &>/dev/null //&表示任何內(nèi)容
- 將正確和錯誤日志都輸出到 /tmp/load.log
*/1 * * * * /root/XXXX.sh > /tmp/load.log 2>&1
- 只輸出正確日志到 /tmp/load.log
*/1 * * * * /root/XXXX.sh > /tmp/load.log
或
*/1 * * * * /root/XXXX.sh 1> /tmp/load.log //1可以省略
- 只輸出錯誤日志到 /tmp/load.log
*/1 * * * * /root/XXXX.sh 2> /tmp/load.log
部分解釋:
/dev/null 代表空設(shè)備文件
> 代表重定向到哪里
1 表示stdout標(biāo)準(zhǔn)輸出,系統(tǒng)默認(rèn)值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr標(biāo)準(zhǔn)錯誤
& 表示等同于的意思,2>&1,表示2的輸出重定向等同于1
2.3 忽略輸入nohup
有時候我們還會看到在定時任務(wù)腳本前面有一個nohup的命令,該命令用于指定后面的腳本忽略輸入。
58 23 * * * nohup sh /home/work/update.sh >> /home/work/log/update.log 2>&1
2.4 后臺執(zhí)行&
無論是在控制臺直接執(zhí)行,還是在定時任務(wù)腳本中,我們在某一條命令的最后面加上&符號,表示當(dāng)前命令在后臺運行,不占用控制臺。
58 23 * * * nohup sh /home/work/update.sh >> /home/work/log/update.log 2>&1 &
這里需要注意,如果執(zhí)行的命令有等待輸入的交互,把這個命令使用&放在后臺運行時,它會一直等待輸入,但是有沒有輸入,就卡住不動了。
2.5 時間處理
再回顧上面的更新任務(wù),它是將每一天的運行結(jié)果都重定向到update.log文件,如果輸出比較多,我們就需要每一天輸出的不同的文件,可以通過在輸出目錄中指定日期用來分割。如下:
58 23 * * * nohup sh /home/work/update.sh >> /home/work/log/`update_"date +\%Y\%m\%d".log` 2>&1 &# 或者下面的形式58 23 * * * nohup sh /home/work/update.sh >> "/home/work/log/update_"date +\%Y\%m\%d".log" 2>&1 &
這里使用date函數(shù),需要注意的是,crontab里面的腳本命令和直接在命令行運行的腳本可能是不一樣的,尤其是date函數(shù)中的%需要轉(zhuǎn)義。
可以直接在命令行運行下面命令:
sh /home/work/update.sh >> /home/work/log/update_`date +"%Y%m%d".log` 2>&1 &
達(dá)到和定時任務(wù)里面相同的效果,都是輸出到update_20201120.log的文件。
但是如果直接在crontab中這樣配置,則無法識別,不會執(zhí)行該定時任務(wù)。下面的crontab任務(wù)是不會執(zhí)行的,date函數(shù)將會報錯。
58 23 * * * nohup sh /home/work/update.sh >> /home/work/log/`update_"date +%Y%m%d".log` 2>&1 &
附錄A
A.1 注意事項
-
新創(chuàng)建的cron job,不會馬上執(zhí)行,至少要過2分鐘才執(zhí)行。如果重啟cron則馬上執(zhí)行
-
當(dāng)crontab突然失效時,可以嘗試/etc/init.d/crond restart解決問題?;蛘卟榭慈罩究茨硞€job有沒有執(zhí)行/報錯tail -f /var/log/cron。文章來源:http://www.zghlxwxcb.cn/news/detail-733558.html
-
千萬別亂運行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除用戶的Crontab文件。刪除了該用戶的所有crontab都沒了。文章來源地址http://www.zghlxwxcb.cn/news/detail-733558.html
A.2 參考博客
- 『學(xué)了就忘』Linux系統(tǒng)定時任務(wù)
到了這里,關(guān)于Linux 定時任務(wù)調(diào)度(crontab)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!