![killall은 모두를 죽이지 않고 거의 죽이지 않습니다. 그렇다면 명령은 무엇입니까?](https://rvso.com/image/833372/killall%EC%9D%80%20%EB%AA%A8%EB%91%90%EB%A5%BC%20%EC%A3%BD%EC%9D%B4%EC%A7%80%20%EC%95%8A%EA%B3%A0%20%EA%B1%B0%EC%9D%98%20%EC%A3%BD%EC%9D%B4%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4.%20%EA%B7%B8%EB%A0%87%EB%8B%A4%EB%A9%B4%20%EB%AA%85%EB%A0%B9%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
나는 때때로 killall
프로세스를 종료하기 위해 명령을 사용합니다. 내가 가끔 말하는 이유는 어떤 경우에는 그것이 나에게 효과가 없었기 때문입니다.
최근의 예는 메모리에 약 5개의 인스턴스가 있는 Thunderbird의 경우이므로 이 killall
명령을 사용하기로 결정했습니다. 프로세스 2개를 종료했지만 3개는 여전히 메모리에 남아 있습니다. 다시 시도했는데 3개가 그대로 남아 있었습니다.
그래서 수동으로 kill -9
명령을 사용하여 PID를 통해 각 개별 프로세스를 종료했습니다. 효과가 있었어요.
나는 주로 kill -9
명령이 작동하는 대로 사용합니다. 이 killall
명령은 나를 너무 많이 실망시켰기 때문에 그것을 사용하는 것을 귀찮게 하지 않았습니다. 그러나 그것이 작동하지 않는 이유가 있어야합니다. 내가 잘못 사용하고 있는 걸까?
다음과 같은 다른 명령이 있다는 것을 알고 있지만 명령이 예상대로 작동하지 않는 pkill
이유를 이해해 주시면 감사하겠습니다 . killall
프로세스 하나만 종료하려고 시도했지만 실패작이었습니다. 그러나 kill -9
명령은 매번 작동합니다.
어떤 아이디어가 있나요?
추신: sudo
별 차이가 없습니다
답변1
killall 매뉴얼 페이지에서
killall은 지정된 명령을 실행하는 모든 프로세스에 신호를 보냅니다. 신호 이름이 지정되지 않으면 SIGTERM이 전송됩니다.
을 수행하면 kill -9
SIGKILL 신호를 보내는 것입니다. killall과 함께 SIGKILL을 보내려면 다음을 수행해야 합니다.
killall -s SIGKILL <PROCESSNAME>
SIGKILL과 SIGTERM의 차이점에 대한 좋은 설명(그리고 SIGTERM을 먼저 시도해야 하는 이유)
에서http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/
Unix 시스템에서 kill을 사용하여 프로세스에 신호를 보내는 것은 대부분의 시스템 관리자에게 새로운 주제는 아니지만 kill과 kill -9의 차이점에 대해 여러 번 질문을 받았습니다.
프로세스에 대해 kill을 사용할 때마다 실제로 프로세스에 신호를 보내는 것입니다(거의 모든 상황에서 – 이에 대해서는 곧 설명하겠습니다). 표준 C 애플리케이션에는 특정 신호를 수신하는 경우 프로세스가 따라야 하는 단계가 포함된 헤더 파일이 있습니다. kill 매뉴얼 페이지를 확인하여 시스템에서 사용 가능한 신호의 전체 목록을 얻을 수 있습니다.
다음과 같은 명령을 고려해보세요.
kill 2563
그러면 SIGTERM이라는 신호가 프로세스에 전송됩니다. 프로세스가 알림을 받으면 몇 가지 다른 일이 발생할 수 있습니다.
- 프로세스가 즉시 중지될 수 있습니다.
- 리소스를 정리한 후 잠시 지연된 후 프로세스가 중지될 수 있습니다.
- 프로세스가 무기한으로 계속 실행될 수 있습니다.
애플리케이션은 SIGTERM이 수신되면 수행할 작업을 결정할 수 있습니다. 대부분의 애플리케이션은 리소스를 정리하고 중지하지만 일부 애플리케이션은 그렇지 않을 수도 있습니다. SIGTERM이 수신되면 완전히 다른 작업을 수행하도록 애플리케이션을 구성할 수 있습니다. 또한 애플리케이션이 디스크 I/O를 기다리는 등 잘못된 상태에 있는 경우 전송된 신호에 대해 조치를 취하지 못할 수도 있습니다.
대부분의 시스템 관리자는 일반적으로 응용 프로그램이 SIGTERM에 응답하지 않을 때 보다 갑작스러운 신호에 의지합니다.
kill -9 2563
-9는 SIGKILL이라는 신호 #9를 보내려는 kill 명령을 알려줍니다. 그런 이름을 가지면 이 신호가 좀 더 큰 의미를 지닌다는 것은 분명합니다.
SIGKILL은 SIGTERM과 동일한 신호 헤더 파일에 정의되어 있지만 프로세스에서 무시할 수 없습니다. 실제로 신호가 커널 초기화로 바로 전달되기 때문에 프로세스는 SIGKILL 신호를 인식하지도 못합니다. 그 시점에서 init는 프로세스를 중지합니다. 프로세스는 신호를 포착하고 이에 따라 조치를 취할 기회를 결코 얻지 못합니다.
그러나 어떤 상황에서는 커널이 프로세스를 성공적으로 종료하지 못할 수도 있습니다. 프로세스가 네트워크 또는 디스크 I/O를 기다리고 있는 경우 커널은 이를 중지할 수 없습니다. 좀비 프로세스와 중단할 수 없는 절전 모드에 있는 프로세스도 커널에 의해 중지될 수 없습니다. 시스템에서 해당 프로세스를 지우려면 재부팅이 필요합니다.
Thunderbird 프로세스에 killall(SIGTERM)을 보냈을 때 해당 프로세스를 중지하도록 요청했습니다. 이러한 프로세스 중 일부는 올바르게 작동하지 않아(아마도 처음에 해당 프로세스를 종료해야 했던 이유일 수 있음) SIGTERM 신호에 대해 조치를 취할 수 없었습니다.
답변2
killall
와 동일한 구문을 대부분 허용합니다 kill
. 특히, killall
와 동등한 기능을 수행하기 위해 멋진 것을 작성할 필요가 없습니다 kill -9
. 이것은 잘 작동합니다.
killall -9 thunderbird
(물론 논의한 바와 같이 다른 조치가 이미 시도되었지만 성공하지 못한 경우가 아니면 일반적으로 killall -9
또는 를 사용하는 것을 꺼려야 합니다.)killall -KILL
답변3
빠른 답변을 원하는 분들을 위해:
sudo killall -s SIGTERM processname