O processo não fecha no tubo quebrado

4

Eu estou começando a seguir o comando de um script bash (argumentos omitidos para simplificar)

avconv | sox | nc

Estou iniciando cerca de 150 desses comandos na mesma caixa ao mesmo tempo.

O último comando nc envia o fluxo para outro host. Quando esse host morre, nc morre, mas avconv e sox podem permanecer ativos. Quando eu então killall sox nessa situação, avconv fica vivo.

Não deveria haver um sigpipe ?

Quando executo o script bash manualmente e nc morre, os outros dois processos também morrem. Mas não quando eu começo muitos desses scripts.

É possível que sigpipe não funcione quando os buffers de pipe estão cheios ou o sistema é altamente contestado? Como posso contornar isso?

    
por Tynix 13.11.2016 / 06:52

1 resposta

1

O seguinte irá matar o grupo de processos quando o nc terminar

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

Dependendo de como isso é iniciado, você pode precisar usar um utilitário como o setsid para restringir as coisas que estão no grupo. Você também pode substituir -g 0 por -P $$ . Isso funciona pelo shell executando o comando pkill após o nc terminar.

Veja também Mate todos os processos descendentes

    
por 13.11.2016 / 20:47