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.