killall은 모두를 죽이지 않고 거의 죽이지 않습니다. 그때 명령은 무엇입니까?


12

때때로 killall명령을 사용하여 프로세스를 종료합니다. 내가 가끔씩 말하는 이유는 어떤 경우에는 그것이 효과가 없었기 때문입니다.

최근 예제는 메모리에 약 5 개의 인스턴스가있는 썬더 버드와 함께 killall명령 을 사용하기로 결정했습니다 . 그것은 2 개의 프로세스를 죽였고 3은 여전히 ​​메모리에 남아 있습니다. 다시 시도하고 3은 여전히 ​​거기에 있었다.

그래서 수동으로 kill -9명령을 사용하여 pid를 통해 각 개별 프로세스를 종료했습니다. 효과가있었습니다.

나는 주로 kill -9명령을 작동대로 사용 합니다. 이 killall명령은 여러 번 실망 시켜서 사용하지 않아도됩니다. 그러나 그것이 작동하지 않는 이유가 있어야합니다. 내가 잘못 사용하고 있습니까?

다른 명령이 있다는 것을 알고 pkill있지만 killall명령이 예상대로 작동하지 않는 이유를 이해해 주셔서 감사합니다 . 나는 심지어 하나의 프로세스 만 죽이려고 시도했으며 그것은 히트와 미스 사건입니다. 그러나 kill -9명령은 매번 작동합니다.

어떤 아이디어?

추신 : sudo차이를 만들지 않습니다

답변:


22

killall 매뉴얼 페이지에서

killall은 지정된 명령을 실행하는 모든 프로세스에 신호를 보냅니다. 신호 이름을 지정하지 않으면 SIGTERM이 전송됩니다.

을 수행 kill -9하면 SIGKILL 신호가 전송됩니다. killall과 함께 SIGKILL을 보내려면해야합니다.

killall -s SIGKILL <PROCESSNAME>

SIGKILL과 SIGTERM의 차이점에 대한 좋은 설명 (그리고 SIGTERM을 먼저 시도 해야하는 이유)

에서 http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/

유닉스 시스템에서 kill을 사용하여 프로세스에 신호를 보내는 것은 대부분의 시스템 관리자에게는 새로운 주제가 아니지만 kill과 kill -9의 차이점에 대해 여러 번 질문을 받았습니다.

프로세스에서 kill을 사용할 때마다 실제로 프로세스에 신호를 전송합니다 (거의 모든 상황에서 곧 시작하겠습니다). 표준 C 애플리케이션에는 특정 신호를 수신 할 때 프로세스가 따라야하는 단계가 포함 된 헤더 파일이 있습니다. 매뉴얼 페이지에서 kill을 확인하여 시스템에서 사용 가능한 전체 신호 목록을 얻을 수 있습니다.

다음과 같은 명령을 고려하십시오.

kill 2563

이는 프로세스에 SIGTERM이라는 신호를 보냅니다. 프로세스가 알림을 받으면 몇 가지 다른 일이 발생할 수 있습니다.

  • 프로세스가 즉시 중단 될 수 있습니다
  • 리소스 정리 후 짧은 지연 후에 프로세스가 중지 될 수 있음
  • 프로세스가 무한정 계속 실행될 수 있습니다

응용 프로그램은 SIGTERM이 수신되면 원하는 작업을 결정할 수 있습니다. 대부분의 응용 프로그램은 리소스를 정리하고 중지하지만 일부 응용 프로그램은 그렇지 않을 수 있습니다. 응용 프로그램은 SIGTERM이 수신 될 때 완전히 다른 것을 수행하도록 구성 될 수 있습니다. 또한 응용 프로그램이 디스크 I / O 대기와 같은 잘못된 상태 인 경우 전송 된 신호에 대해 작동하지 않을 수 있습니다.

대부분의 시스템 관리자는 일반적으로 응용 프로그램이 SIGTERM에 응답하지 않을 때 더 갑작스러운 신호에 의존합니다.

kill -9 2563

-9는 kill 명령에 신호 # 9 (SIGKILL)를 보내도록 지시합니다. 그런 이름으로이 신호가 조금 더 무게를가한다는 것은 명백합니다.

SIGKILL은 SIGTERM과 동일한 신호 헤더 파일에 정의되어 있지만 프로세스에서 무시할 수는 없습니다. 실제로, 신호는 커널 초기화로 바로 이동하기 때문에 프로세스는 SIGKILL 신호를 인식하지 못합니다. 이 시점에서 init는 프로세스를 중지합니다. 프로세스는 신호를 포착하고 그에 따라 행동 할 기회를 얻지 못합니다.

그러나 일부 상황에서는 커널이 프로세스를 성공적으로 종료하지 못할 수 있습니다. 프로세스가 네트워크 또는 디스크 I / O를 기다리고있는 경우 커널은이를 중지 할 수 없습니다. 무정전 수면 상태에 빠진 좀비 프로세스와 프로세스는 커널에 의해 중지 될 수 없습니다. 시스템에서 해당 프로세스를 지우려면 재부팅해야합니다.

killall (SIGTERM)을 썬더 버드 프로세스로 보냈을 때 해당 프로세스 중지를 요청했습니다. 이러한 프로세스 중 일부가 제대로 작동하지 않았기 때문에 (아마도 처음에 프로세스를 종료해야하는 이유) SIGTERM 신호에 대해 작동 할 수 없었습니다.


왜 일부 썬더 버드 개체 만 죽였는 지에 대한 추측?
— Meer Borg

@Doogfar 내 편집 작성자 (또는 내가 링크 된 페이지)를 참조하십시오
— tgm4883

고마워, 또한 내 Thunderbird가 손상된 이유 -9를 죽인 것이 너무 가혹한 이유를 설명합니다
— Meer Borg

여전히 항상 작동하지는 않습니다.
— 크레이그

4

killall와 동일한 구문을 대부분 받아들 kill입니다. 특히, killall와 동등한 작업을 수행 하기 위해 멋진 것을 작성할 필요가 없습니다 kill -9. 이것은 잘 작동합니다.

killall -9 thunderbird

(물론, 논의 된 바와 같이, 일반적으로 사용하기 꺼려한다 killall -9동등, 또는 killall -KILL다른 조치가 이미 성공없이 시도되지 않는 한.)


여전히 항상 작동하지 않으므로 다른 것이 있어야합니다.
— 크레이그
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.