파이프가 파손되면 프로세스를 종료할 수 없습니다.

파이프가 파손되면 프로세스를 종료할 수 없습니다.

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 ; }

시작하는 방법에 따라 그룹에 있는 항목을 제한하기 위해 setid와 같은 유틸리티를 사용해야 할 수도 있습니다. nc가 완료된 후 쉘에서 pkill 명령을 실행하여 이를 수행할 -g 0수도 있습니다 .-P $$

당신은 또한 볼 수 있습니다모든 하위 프로세스 종료

관련 정보