<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          關(guān)于Linux下的crontab,你不知道的那些知識點

          共 9439字,需瀏覽 19分鐘

           ·

          2023-01-11 14:50

          在公眾號后臺回復(fù):JGNB,可獲取杰哥原創(chuàng)的 PDF 手冊。

          實際工作中,crontab出現(xiàn)的問題是多種多樣的,下面就深入介紹下crontab在具體工作中容易出現(xiàn)的問題和解決問題的辦法。

          一、crontab能干啥

          crond是linux下用來周期性的執(zhí)行某種任務(wù)或等待處理某些事件的一個守護進程,與windows下的計劃任務(wù)類似,當安裝完成操作系統(tǒng)后,默認會安裝此服務(wù)工具,并且會自動啟動crond進程,crond進程每分鐘會定期檢查是否有要執(zhí)行的任務(wù),如果有要執(zhí)行的任務(wù),則自動執(zhí)行該任務(wù)。

          Linux下的任務(wù)調(diào)度分為兩類,系統(tǒng)任務(wù)調(diào)度和用戶任務(wù)調(diào)度。

          系統(tǒng)任務(wù)調(diào)度:系統(tǒng)周期性所要執(zhí)行的工作,比如寫緩存數(shù)據(jù)到硬盤、日志清理等。

          用戶任務(wù)調(diào)度:用戶定期要執(zhí)行的工作,比如用戶數(shù)據(jù)備份、定時郵件提醒等。用戶可以使用 crontab 工具來定制自己的計劃任務(wù)。所有用戶定義的crontab 文件都被保存在 /var/spool/cron目錄中。其文件名與用戶名一致。

          關(guān)于crontab的用途,在企業(yè)實際應(yīng)用中非常廣泛,常見的有定時數(shù)據(jù)備份、定時系統(tǒng)檢測、定時數(shù)據(jù)收集、定時更新配置、定時生成報表等等。

          二、crontab應(yīng)用實例

          1、crontab使用格式

          crontab常用的使用格式有如下兩種:

                crontab?[-u?user]?[file]
          crontab?[-u?user]?[-e|-l|-r?|-i]

          選項含義如下:

          • -u user:用來設(shè)定某個用戶的crontab服務(wù),例如,“-u ixdba”表示設(shè)定ixdba用戶的crontab服務(wù),此參數(shù)一般有root用戶來運行。

          • file:file是命令文件的名字,表示將file做為crontab的任務(wù)列表文件并載入crontab。如果在命令行中沒有指定這個文件,crontab命令將接受標準輸入(鍵盤)上鍵入的命令,并將它們載入crontab。

          • -e:編輯某個用戶的crontab文件內(nèi)容。如果不指定用戶,則表示編輯當前用戶的crontab文件。

          • -l:顯示某個用戶的crontab文件內(nèi)容,如果不指定用戶,則表示顯示當前用戶的crontab文件內(nèi)容。

          • -r:從/var/spool/cron目錄中刪除某個用戶的crontab文件,如果不指定用戶,則默認刪除當前用戶的crontab文件。

          • -i:在刪除用戶的crontab文件時給確認提示。

          2、crontab文件語法

          用戶所建立的crontab文件中,每一行都代表一項任務(wù),每行的每個字段代表一項設(shè)置,它的格式共分為六個字段,前五段是時間設(shè)定段,第六段是要執(zhí)行的命令段,格式如下:

                minute?hour?day?month?week?command

          其中:

          • ? minute:表示分鐘,可以是從0到59之間的任何整數(shù)。

          • ? hour:表示小時,可以是從0到23之間的任何整數(shù)。

          • ? day:表示日期,可以是從1到31之間的任何整數(shù)。

          • ? month:表示月份,可以是從1到12之間的任何整數(shù)。

          • ? week:表示星期幾,可以是從0到7之間的任何整數(shù),這里的0或7代表星期日。

          • ? command:要執(zhí)行的命令,可以是系統(tǒng)命令,也可以是自己編寫的腳本文件。

          在以上各個字段中,還可以使用以下特殊字符:

          • ? 星號():代表所有可能的值,例如month字段如果是星號,則表示在滿足其它字段的制約條件后每月都執(zhí)行該命令操作。

          • ? 逗號(,):可以用逗號隔開的值指定一個列表范圍,例如,“1,2,5,7,8,9”

          • ? 中杠(-):可以用整數(shù)之間的中杠表示一個整數(shù)范圍,例如“2-6”表示“2,3,4,5,6”

          • ? 正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執(zhí)行一次。同時正斜線可以和星號一起使用,例如/10,如果用在minute字段,表示每十分鐘執(zhí)行一次。

          3、幾個crontab例子
                0?/3?/usr/local/apache2/apachectl?restart

          表示每隔3個小時重啟apache服務(wù)一次。

                30?3?6?/webdata/bin/backup.sh

          表示每周六的3點30分執(zhí)行/webdata/bin/backup.sh腳本的操作。

                0?0?1,20?fsck?/dev/sdb8

          表示每個月的1號和20號檢查/dev/sdb8磁盤設(shè)備。

                10?5?/5?*?echo?"">/usr/local/apache2/log/access_log

          表示每個月的5號、10號、15號、20號、25號、30號的5點10分執(zhí)行清理apache日志操作。

          三、系統(tǒng)級任務(wù)調(diào)度/etc/crontab

          在/etc目錄下有一個crontab文件,這個就是系統(tǒng)任務(wù)調(diào)度的配置文件。

          /etc/crontab文件包括下面幾行:

                SHELL=/bin/bash
          PATH=/sbin:/bin:/usr/sbin:/usr/bin
          MAILTO=root
          HOME=/
          #?run-parts
          01?*?*?*?*?root?run-parts?/etc/cron.hourly
          02?4?*?*?*?root?run-parts?/etc/cron.daily
          22?4?*?*?0?root?run-parts?/etc/cron.weekly
          42?4?1?*?*?root?run-parts?/etc/cron.monthly

          從上面的示例文件可看出,crontab的任務(wù)列表主要由兩部分組成:環(huán)境變量配置與定時任務(wù)配置。可能大家在工作中更多是只用到了任務(wù)配置部分。

          前四行是用來配置crond任務(wù)運行的環(huán)境變量,第一行SHELL變量指定了系統(tǒng)要使用哪個shell,這里是bash,第二行PATH變量指定了系統(tǒng)執(zhí)行命令的路徑,第三行MAILTO變量指定了crond的任務(wù)執(zhí)行信息將通過電子郵件發(fā)送給root用戶,如果MAILTO變量的值為空,則表示不發(fā)送任務(wù)執(zhí)行信息給用戶,第四行的HOME變量指定了在執(zhí)行命令或者腳本時使用的主目錄。第六至九行就是crontab執(zhí)行格式的具體寫法。

          四、crontab調(diào)試解析神器

          通常在使用crontab添加任務(wù)時,我們會依靠自己已有知識編寫定時語句。當需要測試語句是否正確時,還需要在服務(wù)器上不斷調(diào)試,,這種方式太不高效了。有沒有一款工具,只要我們給出語句,就能告訴具體執(zhí)行時間以及對錯呢?還真有,下面介紹一款老外開發(fā)的crontab在線解析工具。

          工具地址:https://crontab.guru

          給出這個工具的截圖如下:

          ece9294dc6c91163c911371e8a28d01e.webp

          五、crontab使用的各種坑

          1、環(huán)境變量問題

          當我們剛使用crontab時,運維老鳥們一般會告知所有命令盡量都使用絕對路徑,以防錯誤。這是為什么?這就和我們下面要談的環(huán)境變量有關(guān)了。

          首先,獲取shell終端環(huán)境變量,內(nèi)容如下:

                [root@SparkWorker1?dylogs]#?env
          XDG_SESSION_ID=1629
          HOSTNAME=SparkWorker1
          TERM=linux
          SHELL=/bin/bash
          HISTSIZE=1000
          SSH_CLIENT=172.16.213.132?50080?22
          HADOOP_PREFIX=/opt/hadoop/current
          CATALINA_BASE=/opt/hadoop/current/share/hadoop/httpfs/tomcat
          SSH_TTY=/dev/pts/1
          QT_GRAPHICSSYSTEM_CHECKED=1
          USER=root
          MAIL=/var/spool/mail/root
          PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/default/bin:/opt/hadoop/current/bin:/opt/hadoop/current/sbin:/root/bin
          PWD=/data/dylogs
          LANG=zh_CN.UTF-8
          HOME=/root

          要獲取crontab環(huán)境變量信息,可以設(shè)置如下計劃任務(wù):

                *?*?*?*?*?/usr/bin/env?>?/tmp/env.txt

          等待片刻,env.txt輸出內(nèi)容如下:

                [root@SparkWorker1?dylogs]#?cat?/tmp/env.txt
          XDG_SESSION_ID=1729
          SHELL=/bin/sh
          USER=root
          PATH=/usr/bin:/bin
          PWD=/root
          LANG=zh_CN.UTF-8
          SHLVL=1
          HOME=/root
          LOGNAME=root
          XDG_RUNTIME_DIR=/run/user/0
          _=/usr/bin/env

          從上面輸出結(jié)果可知,shell命令行的PATH值為

                PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/default/bin:/opt/hadoop/current/bin:/opt/hadoop/current/sbin:/root/bin

          而crontab中的PATH值為:

                PATH=/usr/bin:/bin

          對比crontab環(huán)境變量與shell終端環(huán)境變量的輸出,可以發(fā)現(xiàn)兩者的差異很大。大家可能遇到過,在shell命令行執(zhí)行腳本都沒有問題,而放到crontab后卻執(zhí)行異常,或者執(zhí)行失敗,此時,我們就需要考慮是否命令涉及的環(huán)境變量在crontab和shell命令行間存在差異。

          例如,我們在crontab中執(zhí)行了如下定時任務(wù):

                20?16?*?*?*?php?autosave.php

          而如果我們的php是安裝在/usr/local/bin/目錄下的話,那么上面這個定時任務(wù)由于無法找到php命令,會運行失敗。

          那么,知道了環(huán)境變量問題,可能導(dǎo)致計劃任務(wù)無法正常執(zhí)行,怎么才能避免這個問題呢,這個交給大家一個終極大招,可以在crontab中加入如下配置,保證你的計劃任務(wù)執(zhí)行不會出現(xiàn)環(huán)境變量問題:

                *?*?*?*?*?source?/$HOME/.bash_profile?&&?command

          這個其實是在執(zhí)行計劃任務(wù)命令之前,先加載了用戶環(huán)境變量信息,由此可保證所有環(huán)境變量都可正常加載。

          2、定時時間配置誤區(qū)

          時間是crontab的核心,稍微配置不當,就會出現(xiàn)問題,先看在整點時間設(shè)置時可能出現(xiàn)的錯誤,例如,設(shè)定每天2點執(zhí)行一次任務(wù),很多朋友可能這么寫過:

                *?2?*?*?*?command

          很明顯,這個時間寫法是錯誤的,當我們聽到每天2點執(zhí)行一次某任務(wù)時,很多人會把重點放在2點,而忽略了執(zhí)行一次的需求。上面這個定時任務(wù)他會在2點開始執(zhí)行,每分鐘執(zhí)行一次,總共執(zhí)行60次。

          正確的寫法應(yīng)該是這樣的:

                0?2?*?*?*?command

          這個才表示每天2點0分執(zhí)行command對應(yīng)的任務(wù)。

          3、特殊符號%問題

          %在crontab中是特殊符號,具體含義如下:

          第一個%表示標準輸入的開始,其余%表示換行符,看下面兩個例子:

                *?*?*?*?*?cat?>>?/tmp/cat.txt?2>&1?%?stdin?out

          查看/tmp/cat.txt的內(nèi)容為:

                stdin?out

          再看下面這個例子:

                *?*?*?*?*?cat?>>?/tmp/cat1.txt?2>&1?%?stdin?out?1?%?stdin?out?2?%?stdin?out?3

          查看 /tmp/cat1.txt的內(nèi)容如下:

                stdin?out?1
          stdin?out?2
          stdin?out?3

          有輸出內(nèi)容可知,第一個%表示標準輸入的開始,其余%表示換行符。

          既然"%"是特殊字符,那么在crontab中使用時,就要特別注意,怎么使用這些特殊字符呢,很明顯,使用轉(zhuǎn)移字符即可,例如:

                *?*?*?*?*?cat?>>?/tmp/cat2.txt?2>&1?%?Special?character?escape?\%.

          查看輸出/tmp/cat2.txt 輸出內(nèi)容如下:

                Special?character?escape?%.

          可以看到,執(zhí)行成功了,并成功避開這個坑了。

          4、關(guān)于crontab的輸出重定向

          在crontab執(zhí)行的計劃任務(wù)中,有些任務(wù)如果不做輸出重定向,那么原本會輸出到屏幕的信息,會以郵件的形式輸出到某個文件中,例如,執(zhí)行下面這個計劃任務(wù):

                *?*?*?*?*?/bin/date

          這個計劃任務(wù)是沒有做輸出重定向的,他的主要用途是輸出時間,由于沒有配置輸出重定向,那么這個時間信息默認將以郵件的形式輸出到/var/spool/mail/$USER(這個$USER對應(yīng)的是系統(tǒng)用戶,這里是root用戶)文件中,大致內(nèi)容如下:

                [email protected]?Fri?Sep?21?12:58:02?2022
          Return-Path:?<[email protected]>
          X-Original-To:?root
          Delivered-To:[email protected]
          Received:?by?SparkWorker1.localdomain?(Postfix,?from?userid?0)
          id?F2745192AE;?Fri,?21?Sep?2022?12:58:01?+0800?(CST)
          From:?"(Cron?Daemon)"?<[email protected]>
          To:[email protected]
          Subject:?Cron?<root@SparkWorker1>?/bin/date
          Content-Type:?text/plain;?charset=UTF-8
          Auto-Submitted:?auto-generated
          Precedence:?bulk
          X-Cron-Env:?<XDG_SESSION_ID=1820>
          X-Cron-Env:?<XDG_RUNTIME_DIR=/run/user/0>
          X-Cron-Env:?<LANG=zh_CN.UTF-8>
          X-Cron-Env:?<SHELL=/bin/sh>
          X-Cron-Env:?<HOME=/root>
          X-Cron-Env:?<PATH=/usr/bin:/bin>
          X-Cron-Env:?<LOGNAME=root>
          X-Cron-Env:?<USER=root>
          Message-Id:?<[email protected]>
          Date:?Fri,?21?Sep?2022?12:58:01?+0800?(CST)
          2022年?09月?21日?星期五?12:58:01?CST

          由此可見,輸出內(nèi)容還是很多的,如遇到任務(wù)有大量輸出的話,會占用大量磁盤空間,顯然,這個郵件輸出最好關(guān)閉,怎么關(guān)閉呢,只需設(shè)置MAILTO環(huán)境變量為空即可,上面的計劃任務(wù),可做如下修改:

                MAILTO=""
          *?*?*?*?*?/bin/date

          這樣,就不會發(fā)郵件信息到/var/spool/mail/$USER下了,但是問題并沒有徹底解決,關(guān)閉mail功能后,輸出內(nèi)容將繼續(xù)寫入到/var/spool/clientmqueue中,長期下去,可能占滿分區(qū)的inode資源,導(dǎo)致任務(wù)無法執(zhí)行。

          為了避免此類問題發(fā)生,建議任務(wù)都加上輸出重定向,例如,可以在crontab文件中設(shè)置如下形式,忽略日志輸出:

                0?*/3?*?*?*?/usr/local/apache2/apachectl?restart?>/dev/null?2>&1

          其中,“/dev/null 2>&1”表示先將標準輸出重定向到/dev/null,然后將標準錯誤重定向到標準輸出,由于標準輸出已經(jīng)重定向到了/dev/null,因此標準錯誤也會重定向到/dev/null,這樣日志輸出問題就解決了。

          5、調(diào)試crontab問題的一般思路

          要解決crontab相關(guān)異常問題,可按照如下思路進行調(diào)試:

          (1)通過/var/log/cron日志確認任務(wù)是否執(zhí)行

          (2)如未執(zhí)行則分析定時語句,是否是環(huán)境變量問題、特殊字符問題、時間配置問題、權(quán)限問題等。

          (3)確認crond服務(wù)開啟,如果定時語句也正確,檢查crond服務(wù)是否開啟。

          Systemd方式(centos7及以上)

                [root@SparkWorker1?spool]#?systemctl?status?crond.service

          SysVinit方式(centos7以下)

                [root@SparkWorker1?spool]#?service?crond?status

          (4)確認定時任務(wù)中命令是否執(zhí)行成功

          這個問題可通過輸出獲取錯誤信息進行調(diào)試,方法就是利用重定向獲取輸出,然后進行分析。舉例如下:

                *?*?*?*?*?python?/usr/local/dyserver/dypos.py?>>?/tmp/dypos.log?2>&1

          通過加上“/tmp/dypos.log 2>&1”,就可以很快定位問題,因為這個dypos.py腳本在執(zhí)行的時候會把錯誤信息都輸出到dypos.log 中,接著查看dypos.log文件,問題一目了然:

                [root@SparkWorker1?spool]#?cat?/tmp/dypos.log
          /bin/sh:?python:?未找到命令
          /bin/sh:?python:?未找到命令

          顯示python命令沒有找到,很明顯的就可以確定是環(huán)境變量的問題。這種方式定位問題非常有效。

          來源:運維漫談

          推薦閱讀:

          Linux 網(wǎng)絡(luò)訪問慢?這個方法快速定位


          Linux 使用 Systemd 管理進程服務(wù)


          Linux 環(huán)境變量總結(jié)


          shell 命令以及運行原理和 Linux 權(quán)限詳解


          Linux 系統(tǒng)中如何刪除軟連接

          4b19a44e7ba0ee739ac0adceb722fe9a.webp

          瀏覽 90
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天堂中文资源库 | 在线黄片观看 | 日韩无码 精品 乱伦 | 亚洲中文婷婷 | 久久久久久偷拍 |