一、介紹
Cron是Linux系統(tǒng)中最有用的工具之一,cron作業(yè)是在指定時(shí)間到來時(shí)被調(diào)度執(zhí)行的作業(yè)。Cron本身是一個(gè)守護(hù)進(jìn)程,在后臺(tái)運(yùn)行,通過配置文件“crontab”來根據(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用來定期執(zhí)行特定任務(wù)所需要的列表文件,又可以指用來創(chuàng)建、刪除、查看當(dāng)前用戶(或者指定用戶)的crontab文件的命令。
- anacron不是守護(hù)進(jìn)程,可以看做是cron守護(hù)進(jìn)程的某種補(bǔ)充程序,anacron是獨(dú)立的linux程序,被cron守護(hù)進(jìn)程或者其他開機(jī)腳本啟動(dòng)運(yùn)行,可以每天、每周、每個(gè)月周期性地執(zhí)行一項(xiàng)任務(wù)(最小單位為天)。適合于可能經(jīng)常會(huì)關(guān)機(jī)的機(jī)器,當(dāng)機(jī)器重新開機(jī)anacron程序啟動(dòng)之后,anacron會(huì)檢查anacron任務(wù)是否在合適的周期執(zhí)行了,如果未執(zhí)行則在anacron設(shè)定好的延遲時(shí)間之后只執(zhí)行一次任務(wù),而不管任務(wù)錯(cuò)過了幾次周期。
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ò)過了任務(wù)執(zhí)行的時(shí)間,cron任務(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ú)分開的。因此每個(gè)用戶都可以使用crontab命令創(chuàng)建自己的cron作業(yè),還可以使用以下命令編輯或查看自己的cron作業(yè)。
三、 操作**
- 查看狀態(tài)
service cron status
- 開啟服務(wù)
service cron start
help
創(chuàng)建并編輯當(dāng)前用戶的crontab
crontab -e
- 3.4 列出當(dāng)前用戶的crontab
crontab -l
- crontab文件語法及示例
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)然也可以停止。如果停止了就無法執(zhí)行任何定時(shí)任務(wù)了,解決的方法是打開它:
crond 或 service crond start 。
如果提示crond命令不存在,可能被誤刪除了,CentOS下可以通過這個(gè)命令重新安裝:
yum -y install crontabs
路徑問題
有的命令在shell中執(zhí)行正常,但是在crontab執(zhí)行卻總是失敗。有可能是因?yàn)閏rontab使用的sh未正確識(shí)別路徑,比如:以root身份登錄shell后執(zhí)行一個(gè)/root/test.sh,只要執(zhí)行./test.sh時(shí)差問題
因?yàn)榉?wù)器與客戶端時(shí)差問題,所以crontab的時(shí)間以服務(wù)器時(shí)間為準(zhǔn)。變量問題
有時(shí)候命令中含有變量,但crontab執(zhí)行時(shí)卻沒有,也會(huì)造成執(zhí)行失敗。權(quán)限問題
解決方法:
增加執(zhí)行權(quán)限,或者用bash abc.sh的方法執(zhí)行.也有可能crontab任務(wù)所屬的用戶對(duì)某個(gè)目錄沒有寫權(quán)限,也會(huì)失敗。
...
六、crontab日志講解
crontab的日志比較簡(jiǎn)單,當(dāng)crond執(zhí)行任務(wù)失敗時(shí)會(huì)給用戶發(fā)一封郵件。
本文介紹crontab在任務(wù)執(zhí)行失敗時(shí),如果發(fā)送郵件也失敗,應(yīng)該怎樣通過增加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
如果日志有問題,可以參考以下做法:
為crontab增加日志
參考:https://blog.csdn.net/qq_38880380/article/details/99625503