管道左侧的杀死过程

时间:2018-08-27 14:48:44

标签: bash process pipe

我在bash中有以下内容:

foo |酒吧

我希望template <typename T1, typename T2> int compare(const T1&, const T2&); 在脚本终止(使用TERM信号)时死掉。不幸的是,他们都没有死亡。我尝试过:

foo

这绝对没有实现。然后我尝试了这个:

exec foo | bar

再次,什么也没有。现在,我还有一个过程,当我终止父进程时,它们都没有死亡。

2 个答案:

答案 0 :(得分:1)

通过杀死整个进程组而不是bash(父进程),您也可以向所有子进程发送终止信号。 语法示例为:

kill -SIGTERM -$!
kill -- -$!

示例:

bash -c 'sleep 50 | sleep 40' & sleep 1; kill -SIGTERM -$!; wait; ps -ef | grep -c sleep
[1] 14683
[1]+  Terminated              bash -c 'sleep 50 | sleep 40'
1

请注意,wait在这里等待bash被有效杀死,这需要花费几毫秒的时间。 还要注意,最终结果(1)是'grep sleep'本身。结果3表示此操作无效,因为还有两个睡眠过程仍在运行。

kill手册中提到:

-n
where n is larger than 1. All processes in process group n are signaled.
When an argument of the form '-n' is given, and it is meant to denote a
process group, either the signal must be specified first, or the argument
must be preceded by a '--' option, otherwise it will be taken as the signal
to send.

答案 1 :(得分:0)

我将使用命名管道,这样可以更轻松地专门获得foo的进程ID。

trap 'kill $foo_pid; rm -f foo_out' EXIT

mkfifo foo_out
foo > foo_out & foo_pid=$!
bar < foo_out