我开始执行 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 来实现的。
也可以看看杀死所有后代进程