
때때로 SIGTERM을 프로세스에 보내면 해당 프로세스가 모든 하위 프로세스에 SIGTERM을 보내게 됩니다. 그러나 때로는 이것이 작동하지 않습니다.
프로세스와 모든 하위 프로세스를 동시에 종료할 수 있는 명령이나 유틸리티가 있습니까? 나는 일반적으로 모든 pid를 하나의 kill 명령으로 수동으로 수집하지만 어리석은 느낌이 듭니다.
이 SO 질문Perl로 이 작업을 수행하는 방법을 묻지만 작업을 완료하는 모든 것이 좋을 것입니다.
답변1
이것그래서 질문이것을 다룬다.
답변2
프로세스가 세션 식별자를 공유한다고 가정하면(setid()를 명시적으로 호출하지 않는 한 공유해야 함) pkill을 사용하여 세션별로 프로세스를 종료할 수 있습니다.
user@machine:~> ps -o pid,sess,cmd -U user
PID SESS CMD
12804 12804 -bash
12916 12804 ps -o pid,sess,cmd -U user
user@machine:~> sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ ps -o pid,sess,cmd -U user
PID SESS CMD
12804 12804 -bash
12920 12804 sh
12921 12804 sh
12922 12804 sh
12924 12804 sh
12926 12804 sh
12928 12804 sh
12937 12804 ps -o pid,sess,cmd -U user
sh-3.00$
다른 터미널에서라면 다음을 수행합니다.
pkill -9 -s 12804
그러면 모든 것이 한꺼번에 죽습니다.
유사하게 프로세스 그룹별로 종료할 수 있지만 이는 연관된 프로세스 체인이 아니라 부모보다 한 수준 아래에 있는 많은 하위 항목에 더 유용한 경향이 있습니다.
답변3
일반적으로 응답 클라이언트는 sigterm을 수신하고 자체적으로 종료하여 포크된 모든 하위 프로세스를 종료해야 합니다. 반면에 클라이언트가 응답하지 않는 경우 정상적인 종료 신호는 아마도 응답을 유발하지 않을 것입니다.
그런 다음 시스템 자체에 지금 프로세스를 중지하라고 지시하는 SIGKILL을 보냅니다. 이는 프로세스가 일부 I/O를 기다리는 것과 같이 중단 불가능한 절전 상태에 있는 경우를 제외하고 대부분의 경우 수행할 수 있습니다. 입력 또는 이와 유사한 것.
이 경우 SIGKILL조차도 프로세스에 아무 작업도 수행하지 않게 됩니다. 하위 프로세스는 아마도 비슷한 지연 상태에 있을 것입니다.
상위 프로세스가 정상적으로 종료될 수 있지만 하위 프로세스는 종료할 수 없는 경계 사례가 있습니다. 그러면 아버지가 사라졌기 때문에 정리할 수 없지만 아무 것도 응답하지 않는 좀비 프로세스가 발생하게 됩니다. 이를 제거하는 유일한 방법은 재부팅하는 것입니다. 하지만 대부분의 경우에는 무해합니다. 사용하려고 했던 소켓이 이미 시들어 버렸을 때 PID를 차지하는 것뿐이기 때문입니다.
답변4
Firefox의 프로세스 트리를 종료하려면 위의 "pkill -9 -s firefox" 명령을 사용하여 종료할 수 있습니까?