我想执行 Program_A ,并通过 Program_B 检查输出。 e.g。
$ Program_A | Program_B
在 Program_B 中,如果某个条件匹配,我希望能够终止 Program_A 。
我正在寻找一种在 BASH 中实现此目的的方法(在popen中使用popen有一个解决方案)。
此外,pidof Program_A
等同样不是一个好的解决方案,因为它可能有很多实例,只有特定的实例才会被终止。
答案 0 :(得分:1)
您可以在Program_A中获取Program_A的进程ID,并将其作为第一行和其他输出打印到Program_B。如果你这样做,那么你可以使用Program_B
中的kill调用来终止Program_A答案 1 :(得分:0)
在Program_B中,当您检测到关闭条件时,您可以close()
stdin。它将导致Program_A在write()
上收到错误并可能终止。
现在,Program_A可能会选择忽略这些错误(我不知道它是你自己的应用程序还是预编译的工具),这里有趣的部分。在Program_B中,您可以检查您的标准输入来自何处:
my_input=`readlink /proc/$$/fd/0`
然后,如果它是像“pipe:[134414]”之类的东西,找到stdout等于
的任何其他进程case "$my_input" in
pipe:*)
for p in /proc/[0-9]*
do
if [ "$my_input" = "`readlink $p/fd/1`" ]
then
bad_guy=`sed -e 's:.*/::' <<< "$p"`
echo "Would you please finish, Mr. $bad_guy ?!"
kill $bad_guy
break
fi
done
;;
*)
echo "We're good";;
esac