【问题标题】:Kill a process when string read from stdout while still showing stdout [duplicate]当字符串从标准输出读取时杀死一个进程,同时仍然显示标准输出[重复]
【发布时间】:2021-06-03 14:10:32
【问题描述】:

我有一个运行循环 10 次的 shell 脚本,在每个循环中程序执行以下操作:

echo "Hello $i times"
sleep 1s

我想要另一个 shell 脚本来读取前一个 shell 脚本的标准输出,并在它读取 Hello 5 times 时终止进程。显然这不是最终的用例,但它是一个示例。我见过的其他部分解决方案可以在匹配字符串后终止进程,但我看不到输出 - 整个过程是静默的 - 这是不可取的。

任何帮助将不胜感激!

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    如果您使用的是基本 bash 脚本 grep -q 将发送一个 sigpipe,这应该足以结束它。

    就一路看到的输出而言,您可以将带有 tee 的流拆分到您的终端中。

    # cat loop.sh
    
    #!/bin/bash
    
    for i in {1..1000}
    do
        echo "Hello $i times"
        sleep 1s
    done
    
    
    # ./loop.sh | tee /dev/tty | grep -q "Hello 5 times"
    Hello 1 times
    Hello 2 times
    Hello 3 times
    Hello 4 times
    Hello 5 times
    #
    

    【讨论】:

    • 使用 stdout>file 如果你想将看门狗部分与执行部分分开(例如,对于多个看门狗),然后观察文件内容:unbuffer your_cmd.sh > .tmp_check.txt &tail -f .tmp_check.txt | sed '/termination_phrase/ q'
    猜你喜欢
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多