首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >特定输出的Bash脚本监控程序

特定输出的Bash脚本监控程序
EN

Stack Overflow用户
提问于 2011-09-07 02:42:40
回答 3查看 1.6K关注 0票数 6

所以这可能是一个简单的问题,但我不是一个bash程序员,我也不能解决这个问题。

我们有一个闭源程序,它调用子程序,该子程序一直运行到退出,此时程序将再次调用子程序。这会无限期地重复。

不幸的是,在一段随机的时间之后,主程序有时会自发地(并且反复地)无法调用子程序。最终的解决方案是联系原始开发人员以获得支持,但在此期间,我们需要一个快速的热修复问题。

我正在尝试编写一个bash脚本,它将监视程序的输出,当它看到特定的字符串时,它将重新启动机器(程序将在引导时再次自动运行)。bash脚本需要将所有标准输出传递到屏幕上,直到它看到特定的字符串。程序还需要继续处理用户输入。

我尝试了以下几种方法,但只取得了有限的成功:

代码语言:javascript
复制
./program1 | ./watcher.sh

watcher.sh基本上就是这样的:

代码语言:javascript
复制
while read line; do
    echo $line
    if [$line == "some string"]
    then
        #the reboot script works fine
        ./reboot.sh 
    fi
done

这看起来工作正常,但是echo语句中的前导空格被去掉了,echo输出挂在中间,直到子程序退出,此时输出的其余部分被打印到屏幕上。有没有更好的方法来完成我需要做的事情?

提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2011-09-07 06:42:19

我会做一些类似这样的事情:

代码语言:javascript
复制
stdbuf -o0 ./program1 | grep --line-buffered "some string" | (read && reboot)
票数 4
EN

Stack Overflow用户

发布于 2011-09-07 03:29:41

  1. 你需要引用你的$line变量,即所有引用的值都是"$line" *(除了read line位)。
  2. 你的program1可能是'paused‘数据的来源。它需要flush它的输出缓冲区。你可能无法控制它,所以

检查您的系统是否有可用的unbuffer命令。如果是这样的话,尝试使用unbuffer cmd1 | watcher,您可能必须尝试使用哪个命令来包装unbuffer,也许您将不得不使用cmd1 | unbuffer watcher

或者,您可以尝试将watcher包装为一个进程组(我认为这是正确的术语),例如

./program1 | { ./watcher.sh ; printf "\n" ; }

我希望这能帮到你。

附注:当您看起来是一个新用户时,如果您得到了一个对您有帮助的答案,请记住将其标记为已接受,并/或给它一个+(或-)作为有用的答案。

票数 0
EN

Stack Overflow用户

发布于 2011-09-07 06:27:39

使用read$REPLY变量,我也建议使用printf而不是echo

代码语言:javascript
复制
while read; do
    printf "%s\n" "$REPLY"
    # '[[' is Bash, quotes are not necessary 
    # use '[ "$REPLY" == "some string" ]' if in another shell
    if [[ $REPLY == "some string" ]] 
    then
        #the reboot script works fine
        ./reboot.sh 
    fi
done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7324588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档