一、介紹
Cron是Linux系統(tǒng)中最有用的工具之一,cron作業(yè)是在指定時(shí)間到來(lái)時(shí)被調(diào)度執(zhí)行的作業(yè)。Cron本身是一個(gè)守護(hù)進(jìn)程枢劝,在后臺(tái)運(yùn)行,通過(guò)配置文件“crontab”來(lái)根據(jù)時(shí)間調(diào)度指定的作業(yè)執(zhí)行卜壕。
1.1 cron您旁,crontab以及anacron的關(guān)系
- cron是大多數(shù)linux發(fā)行版都自帶的守護(hù)進(jìn)程(daemon)
- crontab(cron table的簡(jiǎn)稱)既可以指cron用來(lái)定期執(zhí)行特定任務(wù)所需要的列表文件,又可以指用來(lái)創(chuàng)建轴捎、刪除鹤盒、查看當(dāng)前用戶(或者指定用戶)的crontab文件的命令。
- anacron不是守護(hù)進(jìn)程侦副,可以看做是cron守護(hù)進(jìn)程的某種補(bǔ)充程序侦锯,anacron是獨(dú)立的linux程序,被cron守護(hù)進(jìn)程或者其他開(kāi)機(jī)腳本啟動(dòng)運(yùn)行,可以每天、每周豹储、每個(gè)月周期性地執(zhí)行一項(xiàng)任務(wù)(最小單位為天)。適合于可能經(jīng)常會(huì)關(guān)機(jī)的機(jī)器葱蝗,當(dāng)機(jī)器重新開(kāi)機(jī)anacron程序啟動(dòng)之后,anacron會(huì)檢查anacron任務(wù)是否在合適的周期執(zhí)行了细燎,如果未執(zhí)行則在anacron設(shè)定好的延遲時(shí)間之后只執(zhí)行一次任務(wù)两曼,而不管任務(wù)錯(cuò)過(guò)了幾次周期。
1.2 crontab配置文件
- 系統(tǒng)默認(rèn)crontab文件為/etc/crontab,以及/etc/cron.d/目錄下的文件玻驻,有些程序會(huì)把自己的crontab文件放在/etc/cron.d/目錄下悼凑。cron守護(hù)進(jìn)程會(huì)檢查/etc/crontab以及/etc/cron.d/目錄下的文件,根據(jù)這些文件中的cron任務(wù)所設(shè)置的執(zhí)行時(shí)間決定是否執(zhí)行任務(wù)璧瞬,如果當(dāng)前時(shí)間與cron任務(wù)所設(shè)置的執(zhí)行時(shí)間相同户辫,則執(zhí)行任務(wù)。
- 每個(gè)用戶自己的crontab文件都會(huì)被放在 /var/spool/cron目錄下嗤锉,默認(rèn)為空渔欢,可以使用crontab命令創(chuàng)建。cron守護(hù)進(jìn)程會(huì)檢查/var/spool/cron目錄下的文件瘟忱,根據(jù)這些文件中的cron任務(wù)所設(shè)置的執(zhí)行時(shí)間決定是否執(zhí)行任務(wù)奥额,如果當(dāng)前時(shí)間與cron任務(wù)所設(shè)置的執(zhí)行時(shí)間相同,則執(zhí)行任務(wù)访诱。
1.3 注意事項(xiàng)
cron執(zhí)行的任務(wù)會(huì)在設(shè)定好的時(shí)刻執(zhí)行垫挨,當(dāng)機(jī)器處于關(guān)機(jī)狀態(tài)下并錯(cuò)過(guò)了任務(wù)執(zhí)行的時(shí)間,cron任務(wù)就無(wú)法預(yù)期執(zhí)行了触菜。
二九榔、Cron配置類型
2.1 系統(tǒng)級(jí)Crontab
這些cron作業(yè)被系統(tǒng)服務(wù)和關(guān)鍵作業(yè)所使用,且需要root級(jí)的權(quán)限才能執(zhí)行≌懿矗可以在/etc/crontab文件中查看系統(tǒng)級(jí)的cron作業(yè)剩蟀。
2.2 用戶級(jí)Crontab
用戶級(jí)的cron作業(yè)是針對(duì)每個(gè)用戶單獨(dú)分開(kāi)的。因此每個(gè)用戶都可以使用crontab命令創(chuàng)建自己的cron作業(yè)攻旦,還可以使用以下命令編輯或查看自己的cron作業(yè)喻旷。
三、 操作**
- 查看狀態(tài)
service cron status
- 開(kāi)啟服務(wù)
service cron start
help
創(chuàng)建并編輯當(dāng)前用戶的crontab
crontab -e
- 3.4 列出當(dāng)前用戶的crontab
crontab -l
- crontab文件語(yǔ)法及示例
SHELL=/bin/bash
MAILTO=root@example.com
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
# 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
該文件的前三行代碼設(shè)置了默認(rèn)環(huán)境牢屋。cron守護(hù)進(jìn)程并不提供任何環(huán)境。SHELL變量設(shè)置當(dāng)cron任務(wù)(命令以及腳本)運(yùn)行時(shí)的shell,MAILTO變量設(shè)置cron任務(wù)執(zhí)行結(jié)果發(fā)送的郵箱槽袄,PATH設(shè)置去哪些目錄下尋找cron任務(wù)的命令烙无。注釋部分則解釋一條cron任務(wù)的構(gòu)成,一條cron任務(wù)就是一行遍尺,要設(shè)置多少條cron任務(wù)則寫多少行截酷。一條cron任務(wù)由七個(gè)部分組成。
- 如果你想匹配取值范圍內(nèi)的所有值乾戏,使用“*”
- 想匹配某些特殊的值迂苛,使用“,”,比如2,4,7就匹配的是2鼓择,4以及7三幻。
- 兩個(gè)值被“-”連接表示范圍,此時(shí)匹配的是范圍內(nèi)所有值呐能,包含“-”兩邊的值念搬,比如4-7匹配的就是從4到7。
- 想要表達(dá)每隔一段時(shí)間執(zhí)行一次任務(wù)摆出,使用 “/”朗徊, 比如分鐘部分中的 “*/10”表示每10分鐘運(yùn)行一次,比如小時(shí)部分中的“10-22/2”則表示在早上10點(diǎn)到晚上10點(diǎn)這段時(shí)間內(nèi)偎漫,每隔兩個(gè)小時(shí)運(yùn)行一次爷恳。 注意 :當(dāng)“/”左邊的值可以除盡“/”右邊的值時(shí),任務(wù)才會(huì)運(yùn)行象踊。
3.8 cron.hourly温亲、daily、weekly通危、monthly
示例
4.1 在指定時(shí)間調(diào)度Cron job作業(yè)
#! /bin/sh
echo hello >> /home/ubuntu/workspace/hello.txt
- crontab -e
*/1 * * * * /home/ubuntu/crontest.sh
4.2 刪除log
4.3 清除cache
腳本中加入
echo 1 > /proc/sys/vm/drop_caches
需要系統(tǒng)級(jí)別權(quán)限
4.4 備用
#铸豁! /bin/sh
# 注釋
cd ~/workspace.log
echo "" > trace.log
echo 1 > /proc/sys/vm/drop_caches
copy 到 /etc/cron.hourly/下
注:由于/ etc / crontab文件使用run-parts,因此filename非常嚴(yán)格,不能有點(diǎn)菊碟,腳本中不能有~
五节芥、不執(zhí)行原因**
- cron服務(wù)未啟動(dòng)
crontab不是Linux內(nèi)核的功能,而是依賴一個(gè)crond服務(wù),這個(gè)服務(wù)可以啟動(dòng)當(dāng)然也可以停止头镊。如果停止了就無(wú)法執(zhí)行任何定時(shí)任務(wù)了蚣驼,解決的方法是打開(kāi)它:
crond 或 service crond start 。
如果提示crond命令不存在相艇,可能被誤刪除了颖杏,CentOS下可以通過(guò)這個(gè)命令重新安裝:
yum -y install crontabs
路徑問(wèn)題
有的命令在shell中執(zhí)行正常,但是在crontab執(zhí)行卻總是失敗坛芽。有可能是因?yàn)閏rontab使用的sh未正確識(shí)別路徑留储,比如:以root身份登錄shell后執(zhí)行一個(gè)/root/test.sh,只要執(zhí)行./test.sh時(shí)差問(wèn)題
因?yàn)榉?wù)器與客戶端時(shí)差問(wèn)題咙轩,所以crontab的時(shí)間以服務(wù)器時(shí)間為準(zhǔn)获讳。變量問(wèn)題
有時(shí)候命令中含有變量,但crontab執(zhí)行時(shí)卻沒(méi)有活喊,也會(huì)造成執(zhí)行失敗丐膝。權(quán)限問(wèn)題
解決方法:
增加執(zhí)行權(quán)限,或者用bash abc.sh的方法執(zhí)行.也有可能crontab任務(wù)所屬的用戶對(duì)某個(gè)目錄沒(méi)有寫權(quán)限钾菊,也會(huì)失敗帅矗。
...
六、crontab日志講解
crontab的日志比較簡(jiǎn)單煞烫,當(dāng)crond執(zhí)行任務(wù)失敗時(shí)會(huì)給用戶發(fā)一封郵件浑此。
本文介紹crontab在任務(wù)執(zhí)行失敗時(shí),如果發(fā)送郵件也失敗红竭,應(yīng)該怎樣通過(guò)增加crontab日志的方式記錄錯(cuò)誤原因尤勋。
默認(rèn)情況下,crontab中執(zhí)行的日志寫在/var/log下,如:
[root@centos-7-jarvis cron]# ls /var/log/cron*
/var/log/cron /var/log/cron-20200531 /var/log/cron-20200823
/var/log/cron-20200524 /var/log/cron-20200822
如果日志有問(wèn)題,可以參考以下做法:
為crontab增加日志
參考:https://blog.csdn.net/qq_38880380/article/details/99625503