![管道破损时进程无法关闭](https://linux22.com/image/98587/%E7%AE%A1%E9%81%93%E7%A0%B4%E6%8D%9F%E6%97%B6%E8%BF%9B%E7%A8%8B%E6%97%A0%E6%B3%95%E5%85%B3%E9%97%AD.png)
我开始执行 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 来实现的。
也可以看看杀死所有后代进程