一、介紹
Cron是Linux系統(tǒng)中最有用的工具之一,cron作業(yè)是在指定時間到來時被調(diào)度執(zhí)行的作業(yè)。Cron本身是一個守護進程,在后臺運行,通過配置文件“crontab”來根據(jù)時間調(diào)度指定的作業(yè)執(zhí)行。
1.1 cron,crontab以及anacron的關(guān)系
- cron是大多數(shù)linux發(fā)行版都自帶的守護進程(daemon)
- crontab(cron table的簡稱)既可以指cron用來定期執(zhí)行特定任務(wù)所需要的列表文件,又可以指用來創(chuàng)建、刪除、查看當(dāng)前用戶(或者指定用戶)的crontab文件的命令。
- anacron不是守護進程,可以看做是cron守護進程的某種補充程序,anacron是獨立的linux程序,被cron守護進程或者其他開機腳本啟動運行,可以每天、每周、每個月周期性地執(zhí)行一項任務(wù)(最小單位為天)。適合于可能經(jīng)常會關(guān)機的機器,當(dāng)機器重新開機anacron程序啟動之后,anacron會檢查anacron任務(wù)是否在合適的周期執(zhí)行了,如果未執(zhí)行則在anacron設(shè)定好的延遲時間之后只執(zhí)行一次任務(wù),而不管任務(wù)錯過了幾次周期。
1.2 crontab配置文件
- 系統(tǒng)默認crontab文件為/etc/crontab,以及/etc/cron.d/目錄下的文件,有些程序會把自己的crontab文件放在/etc/cron.d/目錄下。cron守護進程會檢查/etc/crontab以及/etc/cron.d/目錄下的文件,根據(jù)這些文件中的cron任務(wù)所設(shè)置的執(zhí)行時間決定是否執(zhí)行任務(wù),如果當(dāng)前時間與cron任務(wù)所設(shè)置的執(zhí)行時間相同,則執(zhí)行任務(wù)。
- 每個用戶自己的crontab文件都會被放在 /var/spool/cron目錄下,默認為空,可以使用crontab命令創(chuàng)建。cron守護進程會檢查/var/spool/cron目錄下的文件,根據(jù)這些文件中的cron任務(wù)所設(shè)置的執(zhí)行時間決定是否執(zhí)行任務(wù),如果當(dāng)前時間與cron任務(wù)所設(shè)置的執(zhí)行時間相同,則執(zhí)行任務(wù)。
1.3 注意事項
cron執(zhí)行的任務(wù)會在設(shè)定好的時刻執(zhí)行,當(dāng)機器處于關(guān)機狀態(tài)下并錯過了任務(wù)執(zhí)行的時間,cron任務(wù)就無法預(yù)期執(zhí)行了。
二、Cron配置類型
2.1 系統(tǒng)級Crontab
這些cron作業(yè)被系統(tǒng)服務(wù)和關(guān)鍵作業(yè)所使用,且需要root級的權(quán)限才能執(zhí)行??梢栽?etc/crontab文件中查看系統(tǒng)級的cron作業(yè)。
2.2 用戶級Crontab
用戶級的cron作業(yè)是針對每個用戶單獨分開的。因此每個用戶都可以使用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è)置了默認環(huán)境。cron守護進程并不提供任何環(huán)境。SHELL變量設(shè)置當(dāng)cron任務(wù)(命令以及腳本)運行時的shell,MAILTO變量設(shè)置cron任務(wù)執(zhí)行結(jié)果發(fā)送的郵箱,PATH設(shè)置去哪些目錄下尋找cron任務(wù)的命令。注釋部分則解釋一條cron任務(wù)的構(gòu)成,一條cron任務(wù)就是一行,要設(shè)置多少條cron任務(wù)則寫多少行。一條cron任務(wù)由七個部分組成。
- 如果你想匹配取值范圍內(nèi)的所有值,使用“*”
- 想匹配某些特殊的值,使用“,”,比如2,4,7就匹配的是2,4以及7。
- 兩個值被“-”連接表示范圍,此時匹配的是范圍內(nèi)所有值,包含“-”兩邊的值,比如4-7匹配的就是從4到7。
- 想要表達每隔一段時間執(zhí)行一次任務(wù),使用 “/”, 比如分鐘部分中的 “*/10”表示每10分鐘運行一次,比如小時部分中的“10-22/2”則表示在早上10點到晚上10點這段時間內(nèi),每隔兩個小時運行一次。 注意 :當(dāng)“/”左邊的值可以除盡“/”右邊的值時,任務(wù)才會運行。
3.8 cron.hourly、daily、weekly、monthly
示例
4.1 在指定時間調(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)級別權(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非常嚴格,不能有點,腳本中不能有~
五、不執(zhí)行原因**
- cron服務(wù)未啟動
crontab不是Linux內(nèi)核的功能,而是依賴一個crond服務(wù),這個服務(wù)可以啟動當(dāng)然也可以停止。如果停止了就無法執(zhí)行任何定時任務(wù)了,解決的方法是打開它:
crond 或 service crond start 。
如果提示crond命令不存在,可能被誤刪除了,CentOS下可以通過這個命令重新安裝:
yum -y install crontabs
路徑問題
有的命令在shell中執(zhí)行正常,但是在crontab執(zhí)行卻總是失敗。有可能是因為crontab使用的sh未正確識別路徑,比如:以root身份登錄shell后執(zhí)行一個/root/test.sh,只要執(zhí)行./test.sh時差問題
因為服務(wù)器與客戶端時差問題,所以crontab的時間以服務(wù)器時間為準。變量問題
有時候命令中含有變量,但crontab執(zhí)行時卻沒有,也會造成執(zhí)行失敗。權(quán)限問題
解決方法:
增加執(zhí)行權(quán)限,或者用bash abc.sh的方法執(zhí)行.也有可能crontab任務(wù)所屬的用戶對某個目錄沒有寫權(quán)限,也會失敗。
...
六、crontab日志講解
crontab的日志比較簡單,當(dāng)crond執(zhí)行任務(wù)失敗時會給用戶發(fā)一封郵件。
本文介紹crontab在任務(wù)執(zhí)行失敗時,如果發(fā)送郵件也失敗,應(yīng)該怎樣通過增加crontab日志的方式記錄錯誤原因。
默認情況下,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