管道破损时进程无法关闭

管道破损时进程无法关闭

我开始执行 bash 脚本中的命令(为简单起见,省略了参数)

avconv | sox | nc

我将同时在同一个盒子上启动大约 150 个这样的命令。

最后一个nc命令将流发送到另一台主机。当那个宿主死了,nc就死了,但avconv还能sox活着。当我killall sox在这种情况下,avconv还活着。

不应该有一个吗sigpipe

当我手动执行 bash 脚本并nc死掉时,其他两个进程也会死掉。但当我启动许多这样的脚本时就不会了。

sigpipe当管道缓冲区已满或系统处于高度竞争状态时,是否有可能不起作用?我该如何解决这个问题?

答案1

以下将在 nc 结束时杀死进程组

#!/bin/sh
avconv x y z | sox a b c | { nc somewhere port ; pkill -g 0 ; }

根据开始的方式,您可能需要使用像setsid这样的实用程序来限制组中的内容。您也可以替换-g 0-P $$.这是通过在 nc 完成后运行 pkill 命令的 shell 来实现的。

也可以看看杀死所有后代进程

相关内容