0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux計(jì)劃任務(wù)crontab運(yùn)行腳本不正確的問(wèn)題

馬哥Linux運(yùn)維 ? 來(lái)源:博客園薰衣草的旋律 ? 2024-10-23 13:36 ? 次閱讀

問(wèn)題的由來(lái)

寫(xiě)好的程序希望在崩潰之后能夠自啟動(dòng),于是利用linux的crontab功能,添加一個(gè)計(jì)劃任務(wù),每分鐘執(zhí)行一個(gè)腳本查看需要監(jiān)控的進(jìn)程是否還在,如果不在則啟動(dòng)之,否則不做任何事情。這么一個(gè)簡(jiǎn)單的腳本在crontab中運(yùn)行和在shell終端手工運(yùn)行的結(jié)果卻不一樣。

問(wèn)題描述

以下是監(jiān)控腳本/home/watch.sh的內(nèi)容:

#!/bin/sh
shell_log_file=/home/start.log
pid_count=`pidof video_checkup | wc -w`
path=$(cd "$(dirname "$0")"; pwd)
run_command="${path}/video_checkup"
config_path="${path}/config.json"
if [ $pid_count -eq 0  ]; then
     echo `date +%Y-%m-%d_%H:%M:%S`" run $run_command $config_path" >> $shell_log_file
     $run_command $config_path
else
     echo `date +%Y-%m-%d_%H:%M:%S`" video_checkup already running" >> $shell_log_file
fi

在shell終端中執(zhí)行crontab -e 命令添加如下語(yǔ)句:

1 */1* * * */home/watch.sh >/dev/null2>&1

表示該腳本每分鐘運(yùn)行一次,腳本的邏輯很簡(jiǎn)單就是檢查進(jìn)程video_checkup如不存在則運(yùn)行之,可是在實(shí)際測(cè)試中卻發(fā)現(xiàn),video_checkup進(jìn)程不斷增多,每分鐘都被運(yùn)行了一次。

問(wèn)題分析

通過(guò)調(diào)試發(fā)現(xiàn)腳本中if [ $pid_count -eq 0 ]; then每次都會(huì)進(jìn)入并執(zhí)行video_checkup程序,也就是說(shuō)$pid_count -eq 0這個(gè)判斷每次都是true。將 $pid_count 的值導(dǎo)入到log文件中發(fā)現(xiàn)確實(shí)是0 。


但是video_checkup明明在運(yùn)行的啊,不可能是0的,將watch.sh在shell命令行上手工執(zhí)行卻是正常的結(jié)果($pid_count就是實(shí)際的正在運(yùn)行的video_checkup進(jìn)程個(gè)數(shù)的值)。經(jīng)過(guò)google發(fā)現(xiàn),在crontab計(jì)劃任務(wù)中執(zhí)行腳本watch.sh的環(huán)境變量,和自己ssh登錄到shell中手工執(zhí)行watch.sh的環(huán)境變量是不同的,于是乎在watch.sh中加入下面的語(yǔ)句:

echo `export` >> $shell_log_file并分別在crontab中執(zhí)行watch.sh,以及在ssh登錄的shell中手工執(zhí)行watch.sh發(fā)現(xiàn)果然export的結(jié)果不一樣。

在crontab中執(zhí)行watch.sh的時(shí)候log文件中顯示的export結(jié)果中PATH的值是:export PATH="/usr/bin:/bin"
而ssh登錄到shell之后手工執(zhí)行watch.sh之后log文件中顯示的export結(jié)果中的PATH的值是:PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"這個(gè)影響大嗎,難道這個(gè)PATH變量對(duì)pid_count=`pidof video_checkup | wc -w`執(zhí)行的結(jié)果會(huì)有影響?


此時(shí)我想到有一種可能就是,pidof命令是在哪個(gè)目錄下? 在ssh的shell環(huán)境中執(zhí)行:

[root@172-28-246-152 video_checkup]# which pidof
/sbin/pidof

發(fā)現(xiàn)pidof命令是在 /sbin/目錄下,也就是說(shuō)crontab運(yùn)行的環(huán)境中 PATH="/usr/bin:/bin" 目錄中根本沒(méi)有pidof這個(gè)命令,那么在crontab中執(zhí)行 watch.sh中的pid_count=`pidof video_checkup | wc -w`就會(huì)失敗,但是居然連一個(gè)錯(cuò)誤都沒(méi)有報(bào)告,而且pid_count變量中還被賦值了,難道pidof命令找不到的時(shí)候這個(gè)語(yǔ)句也能返回值?

我在ssh的shell中構(gòu)造一個(gè)不存在的pidof路徑,試一下:

[root@172-28-246-152 video_checkup]# pid_count=`/xx/pidof video_checkup | wc -w`
-bash: /xx/pidof: No such file or directory

果然報(bào)錯(cuò)說(shuō)No such file or directory找不到命令,但是此時(shí)pid_count中是否有值呢? 再試一下:

[root@172-28-246-152 video_checkup]# pid_count=`/xx/pidof video_checkup | wc -w` && echo $pid_count
-bash: /xx/pidof: No such file or directory
0

結(jié)果徹底清楚了: 由于crontab在后臺(tái)運(yùn)行,所以pidof命令不存在,我們根本看不到報(bào)錯(cuò)信息,因?yàn)閳?bào)命令不存在的信息是不會(huì)被通過(guò)管道傳遞給 wc -w 的,所以可以說(shuō)出錯(cuò)的時(shí)候wc -w沒(méi)有收到任何輸入,但是其執(zhí)行的結(jié)果卻是 0 那么變量pid_count的值就是 0 了。

問(wèn)題解決

將ssh登錄之后的shell環(huán)境中的PATH賦值到watch.sh腳本中即可,這樣腳本在運(yùn)行的時(shí)候就可以正確找到 pidof 命令得出正確的結(jié)果了 (也即在腳本watch.sh的開(kāi)始處加入代碼PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"即可)

一個(gè)小問(wèn)題居然花了幾個(gè)小時(shí)查清楚原因,可見(jiàn)平時(shí)覺(jué)得簡(jiǎn)單的問(wèn)題在實(shí)際應(yīng)用過(guò)程中還是有很多坑的

鏈接:https://www.cnblogs.com/wangqiguo/p/5399227.html

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11414

    瀏覽量

    212248
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3816

    瀏覽量

    82115
  • 腳本
    +關(guān)注

    關(guān)注

    1

    文章

    395

    瀏覽量

    28283

原文標(biāo)題:Linux計(jì)劃任務(wù)crontab運(yùn)行腳本不正確的問(wèn)題

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦

    linux的定時(shí)任務(wù)設(shè)置和crontab配置

    什么時(shí)候執(zhí)行腳本/bin/sh /home/admin/jiaoben/buy/deleteFile.sh 這一字段可以設(shè)定你要執(zhí)行的腳本,這里要注意一下bin/sh 是指運(yùn)行腳本的命令后面一段時(shí)指
    發(fā)表于 07-08 06:20

    Linux應(yīng)用--日志定時(shí)清理

    -rf {} \; 保存退出(:wq)。 (3)執(zhí)行定時(shí)任務(wù) #crontab -e進(jìn)入定時(shí)任務(wù)編輯頁(yè)面,按i底部出現(xiàn)INSERT,開(kāi)始進(jìn)行任務(wù)
    發(fā)表于 07-09 08:12

    詳解linux定時(shí)任務(wù)

    定時(shí)執(zhí)行程序,實(shí)現(xiàn)腳本中的功能,在linux是通過(guò)etc/init.d/crond這個(gè)服務(wù)來(lái)實(shí)現(xiàn)計(jì)劃任務(wù)
    發(fā)表于 07-25 06:12

    stm32單步執(zhí)行正常,全速運(yùn)行結(jié)果不正確怎么解決

    關(guān)于stm32單步執(zhí)行正常,全速運(yùn)行結(jié)果不正確(時(shí)鐘配置不正確)的問(wèn)題現(xiàn)象,延時(shí)不正常,裝載值與實(shí)際值不符。但是如果在時(shí)鐘配置的部分在debug的情況下單步執(zhí)行,那么一切正常,如果是全
    發(fā)表于 01-25 08:07

    Linux下自動(dòng)運(yùn)行crontab用法說(shuō)明

    文件是對(duì)系統(tǒng)級(jí)任務(wù)的配置。語(yǔ)法說(shuō)明以下是兩個(gè)cron語(yǔ)句的例子(在 /etc/crontab 文件里)。前者用來(lái)晚間備份 /etc 目錄,后者運(yùn)行Analog程序處理服務(wù)器的統(tǒng)計(jì)信息。12 3
    發(fā)表于 04-02 14:32 ?281次閱讀

    Linux任務(wù)調(diào)度crontab時(shí)間規(guī)則介紹

    到禮拜三的早上11點(diǎn)  0 11 4 * mon-wed date  #1月份日早上4點(diǎn)  0 4 1 jan * date  補(bǔ)充:在使用crontab的時(shí)候,要特別注意的是運(yùn)行腳本中能夠訪問(wèn)
    發(fā)表于 04-02 14:33 ?327次閱讀

    關(guān)于stm32單步執(zhí)行正常,全速運(yùn)行結(jié)果不正確(時(shí)鐘配置不正確)的問(wèn)題

    關(guān)于stm32單步執(zhí)行正常,全速運(yùn)行結(jié)果不正確(時(shí)鐘配置不正確)的問(wèn)題現(xiàn)象,延時(shí)不正常,裝載值與實(shí)際值不符。但是如果在時(shí)鐘配置的部分在debug的情況下單步執(zhí)行,那么一切正常,如果是全
    發(fā)表于 11-30 15:36 ?11次下載
    關(guān)于stm32單步執(zhí)行正常,全速<b class='flag-5'>運(yùn)行</b>結(jié)果<b class='flag-5'>不正確</b>(時(shí)鐘配置<b class='flag-5'>不正確</b>)的問(wèn)題

    淺析Wireshark流量添加計(jì)劃任務(wù)行為檢測(cè)

    at命令是Windows自帶的用于創(chuàng)建計(jì)劃任務(wù)的命令,但是at命令只在2003及以下的版本使用。
    的頭像 發(fā)表于 10-19 09:10 ?1290次閱讀

    APM32F051C8T6_時(shí)鐘_系統(tǒng)主頻不正確

    APM32F051C8T6_時(shí)鐘_系統(tǒng)主頻不正確
    發(fā)表于 11-09 21:03 ?0次下載
    APM32F051C8T6_時(shí)鐘_系統(tǒng)主頻<b class='flag-5'>不正確</b>

    Crontab:簡(jiǎn)單實(shí)用的Python 周期任務(wù)調(diào)度工具

    如果你想周期性地執(zhí)行某個(gè) Python 腳本,最出名的選擇應(yīng)該是 Crontab 腳本,但是 Crontab 具有以下缺點(diǎn): 1.不方便執(zhí)行 秒級(jí)
    的頭像 發(fā)表于 11-01 09:40 ?909次閱讀

    使用crontab定時(shí)執(zhí)行腳本

    先介紹一下crontab: crontab命令常見(jiàn)于Unix和類(lèi)Unix的操作系統(tǒng)之中,用于設(shè)置周期性被執(zhí)行的指令。該命令從標(biāo)準(zhǔn)輸入設(shè)備讀取指令,并將其存放于“crontab”文件中,以供之后
    的頭像 發(fā)表于 11-03 15:49 ?712次閱讀

    ie瀏覽器限制運(yùn)行腳本

    IE瀏覽器限制運(yùn)行腳本是指在Internet Explorer瀏覽器中,存在一些限制和安全策略,以保護(hù)用戶(hù)的電腦免受惡意腳本的攻擊。這些限制有助于防止在瀏覽器中執(zhí)行惡意代碼,保護(hù)用戶(hù)的隱私和電腦
    的頭像 發(fā)表于 11-26 11:19 ?1744次閱讀

    linux定時(shí)任務(wù)的用法總結(jié)

    習(xí)慣了使用 windows 的計(jì)劃任務(wù),使用 linux 中的 crontab 管理定時(shí)任務(wù)時(shí)很不適應(yīng)。
    的頭像 發(fā)表于 08-14 18:16 ?1022次閱讀
    <b class='flag-5'>linux</b>定時(shí)<b class='flag-5'>任務(wù)</b>的用法總結(jié)

    Linux計(jì)劃任務(wù)介紹

    1.計(jì)劃任務(wù)(定時(shí)任務(wù))基本概述 1.什么是crond crond就是計(jì)劃任務(wù),類(lèi)似于我們平時(shí)生活中的鬧鐘。定點(diǎn)執(zhí)行。 2.為什么要使用crond?crond主要是做一些周期性的任務(wù),
    的頭像 發(fā)表于 11-24 15:49 ?619次閱讀

    Linux計(jì)劃任務(wù)cron詳解

    cron是linux下用來(lái)周期性的執(zhí)行某種任務(wù)或等待處理某些事件的一個(gè)守護(hù)進(jìn)程,與windows下的計(jì)劃任務(wù)類(lèi)似,當(dāng)安裝完成操作系統(tǒng)后,默認(rèn)會(huì)安裝此服務(wù) 工具,并且會(huì)自動(dòng)啟動(dòng)crond進(jìn)程,crond進(jìn)程每分鐘會(huì)定期檢查是否有要
    的頭像 發(fā)表于 02-07 15:31 ?511次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>計(jì)劃任務(wù)</b>cron詳解

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品