리눅스에서 프로세스 트리를 어떻게 죽이나 요? [닫은]


14

때때로 SIGTERM을 프로세스로 전송하면 SIGTERM이 모든 하위 프로세스로 전송됩니다. 그러나 때로는 이것이 작동하지 않습니다.

프로세스와 모든 하위 프로세스를 동시에 종료 할 수있는 명령이나 유틸리티가 있습니까? 나는 보통 모든 pid를 하나의 kill 명령으로 수동 수집하는 것에 의지하지만 어리석은 느낌이 든다.

이 SO 질문 은 펄 로이 작업을 수행하는 방법을 묻지 만 작업을 수행하는 모든 것이 좋습니다.


어떤 이유로 든 pkill -9보다 강력한 것 같습니다 pkill.
Andrew

답변:



13

프로세스가 세션 식별자를 공유한다고 가정하면 (명시 적으로 setsid ()를 호출하지 않는 한 세션 식별자를 사용함) 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

그런 다음 모든 것이 한 번에 죽었습니다.

프로세스 그룹별로 비슷하게 죽일 수 있지만, 연결된 프로세스 체인이 아니라 부모보다 한 수준 아래에있는 많은 어린이에게 더 유용합니다.


2

일반적으로 응답하는 클라이언트는 sigterm을 받고 자체적으로 종료해야하므로 모든 분기 하위 프로세스를 종료해야합니다. 반면에 클라이언트가 응답하지 않으면 정상적인 종료 신호가 응답하지 않을 수 있습니다.

따라서 SIGKILL을 보내면 시스템 자체가 프로세스를 중지하도록 지시합니다. 이제 프로세스가 일부 I / O 대기와 같은 인터럽트 불가능한 상태 인 경우를 제외하고 대부분의 시간을 할 수 있습니다. 입력 또는 유사.

이 경우 SIGKILL조차도 프로세스에 아무런 영향을 미치지 않습니다. 자식 프로세스는 아마도 비슷한 지연 상태에있을 것입니다.

부모 프로세스가 멋지게 종료 될 수있는 국경 사건이 있지만 자식 프로세스는 죽일 수 없습니다. 그런 다음 아버지가 없어진 후에는 정리할 수없는 좀비 프로세스가 발생하지만 아무 것도 응답하지 않습니다. 이를 제거 할 수있는 유일한 방법은 재부팅입니다. 그러나 대부분의 경우 사용하려는 소켓이 이미 사라진 동안 PID를 사용하는 것만으로도 무해합니다.


2

Firefox의 프로세스 트리를 죽이려면 위의 "pkill -9 -s firefox"명령으로 죽일 수 있습니다

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