一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

馬哥Linux運(yùn)維 ? 來源:博客園薰衣草的旋律 ? 2024-10-23 13:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

問題的由來

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

問題描述

以下是監(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 命令添加如下語句:

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

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

問題分析

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


但是video_checkup明明在運(yùn)行的啊,不可能是0的,將watch.sh在shell命令行上手工執(zhí)行卻是正常的結(jié)果($pid_count就是實際的正在運(yùn)行的video_checkup進(jìn)程個數(shù)的值)。經(jīng)過google發(fā)現(xiàn),在crontab計劃任務(wù)中執(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的結(jié)果不一樣。

在crontab中執(zhí)行watch.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"這個影響大嗎,難道這個PATH變量對pid_count=`pidof video_checkup | wc -w`執(zhí)行的結(jié)果會有影響?


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

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

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

我在ssh的shell中構(gòu)造一個不存在的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

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

問題解決

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

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

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

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

    關(guān)注

    87

    文章

    11508

    瀏覽量

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

    關(guān)注

    117

    文章

    3826

    瀏覽量

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

    關(guān)注

    1

    文章

    398

    瀏覽量

    28439

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

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

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

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

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

    詳解linux定時任務(wù)

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

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

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

    Linux下自動運(yùn)行crontab用法說明

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

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

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

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

    關(guān)于stm32單步執(zhí)行正常,全速運(yùn)行結(jié)果不正確(時鐘配置不正確)的問題現(xiàn)象,延時不正常,裝載值與實際值不符。但是如果在時鐘配置的部分在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>(時鐘配置<b class='flag-5'>不正確</b>)的問題

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

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

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

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

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

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

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

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

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

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

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

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

    Linux計劃任務(wù)介紹

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

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

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