프로세스와 하위 프로세스를 모두 죽이는 방법?


9

파이썬의 서브 프로세스 모듈에서 여러 줄의 메시지를 얻는 방법을 묻는 질문 을했습니다.

문제는 테스트 과정에서 너 구스 프로세스를 실행하는 파이썬 프로세스를 죽여야한다는 것입니다. 명령 행에서 ^ c를 사용하면 파이썬 프로세스는 종료하지만 gnuprocess는 종료하지 않습니다.

너구리를 죽이려면 ps aux | grep gnuchess 를 실행하고 kill -9 PID를 실행하십시오 . 파이썬과 너 구스 프로세스를 모두 죽일 수있는 다른 방법이 있습니까?


8
랜덤 (!) 참고 : 당신이 사용할 수있는 pkill이름으로 프로세스를 종료하려면 이렇게 ps aux | grep gnuchesskill -9 PID단지가 될 수있다pkill -9 gnuchess
마이클 Mrozek

답변:


10

프로그램이 협력한다면 표준 방법이 있습니다. 실행 kill -- -42(42)는 부모 프로세스의 PID가입니다. 이것은 프로세스 42에 의해 리드 된 프로세스 그룹 의 모든 프로세스에 신호를 보냅니다 (pid는 프로세스 그룹 앞의 빼기 ​​부호).

일반적으로 쉘 프롬프트에서 파이썬 스크립트를 실행하고 단순히 포크 gnuchess하면 두 프로세스는 동일한 프로세스 그룹에 남아 있어야합니다. 그러나 Ctrl+ CSIGINT전체 포 그라운드 프로세스 그룹으로 전송 하기 때문에 그렇지 않습니다 .

Gnuchess 자체가 세션 리더가 되었기 때문에 (하지만 왜 그렇게하는지 모르겠습니다) 또는 두 번 포크했기 때문에 (python은 gunk를 포크하는 쉘을 포크하기 때문에) 자체 프로세스 그룹에있을 수 있습니다. 이중 포크는 피할 수 있지만 코드를 보지 않으면 어떻게 말할 수 없습니다.


gnuchess공정 의 pid를 찾는 합리적이고 신뢰할 수있는 POSIX 호환 방법 은 다음과 같습니다.

gnuchess_pids=$(ps -A -o pid= -o cmd= | awk '$2 ~ /(^|\/)gnuchess$/ {print $1}')

특정 유닉스 변형은이를 달성하는 더 좋은 방법을 가질 수 있습니다 pgrep.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.