<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>

          Linux計劃任務crontab運行腳本不正確的問題

          共 3191字,需瀏覽 7分鐘

           ·

          2024-05-24 07:33


                   

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

          閱讀目錄

          • 問題的由來

          • 問題描述

          • 問題分析

          • 問題解決

          問題的由來

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

          問題描述

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

          #!/bin/shshell_log_file=/home/start.logpid_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_pathelse     echo `date +%Y-%m-%d_%H:%M:%S`" video_checkup already running" >> $shell_log_filefi

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

          1

          */1 * * * *  /home/watch.sh >/dev/null 2>&1

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


          問題分析

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


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

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

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


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

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

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

          我在ssh的shell中構造一個不存在的pidof路徑,試一下:

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

          果然報錯說No such file or directory找不到命令,但是此時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 directory0

          結果徹底清楚了: 由于crontab在后臺運行,所以pidof命令不存在,我們根本看不到報錯信息,因為報命令不存在的信息是不會被通過管道傳遞給 wc -w  的,所以可以說出錯的時候wc -w沒有收到任何輸入,但是其執(zhí)行的結果卻是 0 那么變量pid_count的值就是 0 了。 

          問題解決

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

          一個小問題居然花了幾個小時查清楚原因,可見平時覺得簡單的問題在實際應用過程中還是有很多坑的。



          春招已經開始啦,大家如果不做好充足準備的話,春招很難找到好工作。


          送大家一份就業(yè)大禮包,大家可以突擊一下春招,找個好工作!


          瀏覽 50
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  免费手机在线看日韩 | 黄色一级免费视频 | 午夜精品18 视频国产 | 中文无码熟妇人妻 | 高清无码免费观看视频 |