Cron介紹

一、介紹

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容