shell 当满足预期输出时终止正在运行的命令

7xzttuei  于 2023-03-09  发布在  Shell
关注(0)|答案(2)|浏览(138)

我有一个命令,它将做一些活动,将在屏幕上显示消息,其中包含字“继续”。只要找到该字,我想杀死该命令。我尝试了以下语法,但它不起作用。

Command_to_run >> "logfile" 2>&1 &    
    pid=$!
        while ! grep -q "continue"  "$logfile" ; 
         do
           sleep 1
         done
kill -$pid
8tntrjer

8tntrjer1#

您可以使用coproc来执行此操作

#! /bin/bash

coproc ./command_to_run
until [[ $line =~ continue ]]; do
    read -r -u ${COPROC[0]} line
done
kill $COPROC_PID

如果你真的需要日志文件,你可以在循环中写入它。

bakd9h0s

bakd9h0s2#

一种方法是让command_to_run将输出重定向到一个管道,并在请求的输出出现在输出中时立即关闭管道。
当标准输出关闭时,大多数命令在尝试向stdout写入新内容时将立即退出。
以下是如何实现这一目标的一个示例:
文件command_to_run

#!/bin/bash
echo start
seq 2 
echo continue
seq 10
echo end
$ ./command_to_run | tee logfile | awk '1;/continue/{exit}'
start
1
2
continue

或者,如果不需要输出显示在stdout中,可以使用grep

./command_to_run | tee logfile | grep -q continue

$ cat logfile 
start
1
2
continue

值得一提的是,OP中的代码几乎可以正常工作,只是需要一些小的调整:

  • 删除grep命令中logfile的美元符号,以匹配上面使用的名称
  • 使用重定向而不附加到logfile,以便continue字符串不存在于之前的执行中
  • 在kill命令中添加选项结束修饰符--,以便负PID(组)不被评估为信号编号。
./command_to_run > "logfile" 2>&1 &    
pid=$!
while ! grep -q "continue"  "logfile" ; 
do
  sleep 1
done
kill -- -$pid

相关问题