那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

馬哥Linux運維 ? 來源:博客園薰衣草的旋律 ? 2024-10-23 13:36 ? 次閱讀

問題的由來

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

問題描述

以下是監控腳本/home/watch.sh的內容:

#!/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終端中執行crontab -e 命令添加如下語句:

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

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

問題分析

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


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

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

在crontab中執行watch.sh的時候log文件中顯示的export結果中PATH的值是:export PATH="/usr/bin:/bin"
而ssh登錄到shell之后手工執行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`執行的結果會有影響?


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

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

發現pidof命令是在 /sbin/目錄下,也就是說crontab運行的環境中 PATH="/usr/bin:/bin" 目錄中根本沒有pidof這個命令,那么在crontab中執行 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 directory
0

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

問題解決

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

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210403
  • 程序
    +關注

    關注

    117

    文章

    3796

    瀏覽量

    81418
  • 腳本
    +關注

    關注

    1

    文章

    392

    瀏覽量

    14938

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

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    linux的定時任務設置和crontab配置

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

    Linux應用--日志定時清理

    -rf {} \; 保存退出(:wq)。 (3)執行定時任務 #crontab -e進入定時任務編輯頁面,按i底部出現INSERT,開始進行任務
    發表于 07-09 08:12

    詳解linux定時任務

    定時執行程序,實現腳本中的功能,在linux是通過etc/init.d/crond這個服務來實現計劃任務
    發表于 07-25 06:12

    stm32單步執行正常,全速運行結果不正確怎么解決

    關于stm32單步執行正常,全速運行結果不正確(時鐘配置不正確)的問題現象,延時不正常,裝載值與實際值不符。但是如果在時鐘配置的部分在debug的情況下單步執行,那么一切正常,如果是全
    發表于 01-25 08:07

    Linux下自動運行crontab用法說明

    文件是對系統級任務的配置。語法說明以下是兩個cron語句的例子(在 /etc/crontab 文件里)。前者用來晚間備份 /etc 目錄,后者運行Analog程序處理服務器的統計信息。12 3
    發表于 04-02 14:32 ?261次閱讀

    Linux任務調度crontab時間規則介紹

    到禮拜三的早上11點  0 11 4 * mon-wed date  #1月份日早上4點  0 4 1 jan * date  補充:在使用crontab的時候,要特別注意的是運行腳本中能夠訪問
    發表于 04-02 14:33 ?294次閱讀

    關于stm32單步執行正常,全速運行結果不正確(時鐘配置不正確)的問題

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

    萬用表讀數不正確如何修復

    使用萬用表在讀取電壓時,您可能會注意到,在一個已知的電壓源上,萬用表電壓讀數波動劇烈或不正確,這通常是內部保險絲熔斷的跡象。這時需要測試保險絲是否導通,并根據用戶手冊推薦的保險絲更換。
    的頭像 發表于 07-07 09:27 ?5751次閱讀

    淺析Wireshark流量添加計劃任務行為檢測

    at命令是Windows自帶的用于創建計劃任務的命令,但是at命令只在2003及以下的版本使用。
    的頭像 發表于 10-19 09:10 ?1135次閱讀

    APM32F051C8T6_時鐘_系統主頻不正確

    APM32F051C8T6_時鐘_系統主頻不正確
    發表于 11-09 21:03 ?0次下載
    APM32F051C8T6_時鐘_系統主頻<b class='flag-5'>不正確</b>

    Crontab:簡單實用的Python 周期任務調度工具

    如果你想周期性地執行某個 Python 腳本,最出名的選擇應該是 Crontab 腳本,但是 Crontab 具有以下缺點: 1.不方便執行 秒級
    的頭像 發表于 11-01 09:40 ?804次閱讀

    使用crontab定時執行腳本

    先介紹一下crontab: crontab命令常見于Unix和類Unix的操作系統之中,用于設置周期性被執行的指令。該命令從標準輸入設備讀取指令,并將其存放于“crontab”文件中,以供之后
    的頭像 發表于 11-03 15:49 ?632次閱讀

    ie瀏覽器限制運行腳本

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

    linux定時任務的用法總結

    習慣了使用 windows 的計劃任務,使用 linux 中的 crontab 管理定時任務時很不適應。
    的頭像 發表于 08-14 18:16 ?904次閱讀
    <b class='flag-5'>linux</b>定時<b class='flag-5'>任務</b>的用法總結

    Linux計劃任務介紹

    1.計劃任務(定時任務)基本概述 1.什么是crond crond就是計劃任務,類似于我們平時生活中的鬧鐘。定點執行。 2.為什么要使用crond?crond主要是做一些周期性的任務,
    的頭像 發表于 11-24 15:49 ?352次閱讀
    百家乐官网任你博娱乐| 沙龙百家乐怎申请| 百家乐官网投住系统| 百家乐2号机器投注技巧| 大发888客服| 金赞百家乐官网现金网| 百家乐官网园选| 百家乐娱乐平台真钱游戏| 狮威亚洲娱乐城| 百家乐官网桌套装| 威尼斯人娱乐场安全吗| 利高百家乐官网娱乐城| 百家乐视频游戏冲值| 博狗娱乐城注册| 将军百家乐官网的玩法技巧和规则 | 百家乐官网的必胜方法| 赌百家乐官网庄闲能赢| 凱旋門百家乐娱乐城| 百家乐官网平台哪个好本站所有数据都是网友推荐及提供 | 百家乐如何制| 娱乐城开户免存送现金| 百家乐官网是个什么样的游戏| 太阳城公司| 百家乐官网赌场合作| 免费百家乐统计工具| 澳门百家乐官网娱乐城送体验金 | 梭哈棋牌游戏大厅| 百家乐官网高命中投注| 网上赌百家乐的玩法技巧和规则 | 太阳城百家乐官网群| 百家乐棋牌交| 威尼斯人娱乐城百家乐赌博| 百家乐官网最新投注方法| 新世百家乐的玩法技巧和规则 | 金道博彩| 赌百家乐波音备用网| 六合彩报码| 百家乐10法则| 搏天堂| 百家乐过两关| 定边县|