使用脚本X获取为stdin提供的进程的PID

时间:2012-03-09 04:05:40

标签: bash pid

我想执行 Program_A ,并通过 Program_B 检查输出。 e.g。

$ Program_A | Program_B

Program_B 中,如果某个条件匹配,我希望能够终止 Program_A

我正在寻找一种在 BASH 中实现此目的的方法(在popen中使用popen有一个解决方案)。

此外,pidof Program_A等同样不是一个好的解决方案,因为它可能有很多实例,只有特定的实例才会被终止。

2 个答案:

答案 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