"kill -9"가 작동하지 않으면 어떻게 되나요?

"kill -9"가 작동하지 않으면 어떻게 되나요?

종료할 수 없는 프로세스가 있습니다 kill -9 <pid>. 특히 제가 프로세스의 소유자이기 때문에 이 경우 문제가 무엇입니까? 나는 이 선택에서 벗어날 수 없다고 생각한다 kill.

답변1

kill -9(신호 살해) 프로세스를 종료할 수 있는 권한이 있는 한 항상 작동합니다. 기본적으로 프로세스는 setuid나 setgid가 아닌 사용자가 시작해야 합니다. 그렇지 않으면 루트 사용자여야 합니다. 한 가지 예외가 있습니다. 루트라도 initPID 1(프로세스)에 치명적인 신호를 보낼 수 없습니다.

하지만 kill -9효과가 보장되는 것은 아닙니다. 모든 신호(SIGKILL 포함)는 비동기식으로 전달됩니다. 커널이 신호를 전달하는 데 약간의 시간이 걸릴 수 있습니다. 일반적으로 신호를 전달하는 데 최대 몇 마이크로초가 걸리며, 이는 대상이 타임 슬라이스를 얻는 데 걸리는 시간과 정확히 같습니다. 그러나 대상이 있는 경우신호를 차단했습니다, 신호는 대상이 잠금을 해제할 때까지 대기됩니다.

일반적으로 프로세스는 SIGKILL을 차단할 수 없습니다. 그러나 커널 코드는 수행하며 프로세스는 호출될 때 커널 코드를 실행합니다.시스템 호출. 시스템 호출이 중단되면 커널 코드는 모든 신호를 차단하여 커널 어딘가에 잘못된 데이터 구조가 발생하거나 보다 일반적으로 일부 커널 불변성을 위반하게 됩니다. 따라서 (버그나 설계 오류로 인해) 시스템 호출이 무기한 차단되는 경우 실제로 프로세스를 종료하는 것이 불가능할 수 있습니다. (하지만 그 과정은~ 할 것이다시스템 호출이 완료되면 종료됩니다. )

시스템 호출에서 차단된 프로세스는 다음 위치에 있습니다.방해받지 않는 수면. ps또는 명령은 top(대부분의 unice에서) 상태를 표시합니다 D(원래는 "제 생각에는).

중단되지 않는 긴 절전 모드의 일반적인 경우는 프로세스가 파일에 액세스하는 경우입니다.네트워크 파일 시스템서버가 응답하지 않을 때 최신 구현에서는 중단 없는 절전 모드를 적용하지 않는 경향이 있습니다(예를 들어 Linux에서는 커널 2.6.25부터 SIGKILL이 NFS 액세스에서 차단된 프로세스를 중단합니다).

프로세스가 오랫동안 중단 없이 절전 모드인 경우 디버거를 연결하고 다음과 같은 진단 도구를 실행하여 이를 수행할 수 있습니다.스트레스또는(또는 UNIX 유형에 따라 유사한 도구) 또는 다음과 같은 다른 진단 메커니즘을 사용하십시오./proc/PID/syscall리눅스에서. 바라보다"kill -9"를 사용하여 wget 프로세스를 종료할 수 없습니다.중단 없는 수면 과정을 연구하는 방법에 대한 추가 토론.

때로는 또는 출력에서 ​​표시된 항목을 볼 수도 있습니다 Z(또는 HLinux에서는 차이점이 무엇인지 모르겠습니다). 기술적으로 이들은 프로세스가 아니며, 좀비 프로세스이며, 상위 프로세스가 하위 프로세스의 종료를 알릴 수 있도록 유지되는 프로세스 테이블의 항목에 지나지 않습니다. 상위 프로세스가 실행되면 사라집니다.pstop집중하다(또는 죽음).

답변2

때때로 프로세스가 존재하지만 다음과 같은 이유로 종료될 수 없습니다.

  • 좀비가 되세요. 즉, 상위 프로세스가 종료 상태를 읽지 않았습니다. 이러한 프로세스는 PID 항목을 제외하고는 리소스를 소비하지 않습니다. topZ로 표시된
  • 방해받지 않는 수면이 잘못되었습니다. 이런 일이 일어나서는 안 되지만, 결함이 있는 커널 코드 및/또는 결함이 있는 하드웨어의 조합으로 인해 가끔 발생합니다. 유일한 방법은 재부팅하거나 기다리는 것입니다. topD가 신호를 보낸다 .

답변3

당신도 하나쯤은 있을 것 같은데요좀비 프로세스. 이는 무해합니다. 좀비 프로세스가 소비하는 유일한 리소스는 프로세스 테이블의 항목입니다. 부모 프로세스가 죽거나 자식 프로세스가 죽으면 사라집니다.

top다음 명령을 사용하여 프로세스가 좀비 프로세스인지 확인할 수 있습니다.

ps aux | awk '$8=="Z" {print $2}'

답변4

만약에 @마세이'모래 @자일스대답이 문제를 해결하지 못하고 프로세스를 인식하지 못합니다(그리고 배포판이 무엇인지 물어봐도 답을 찾을 수 없습니다). 루트킷 및 기타 감염 징후를 확인하세요.소유하다. 루트킷은 프로세스 종료를 완전히 방지할 수 있습니다. 사실, 많은 사람들이 당신이 그것을 보지 못하게 할 수 있습니다. 그러나 작은 프로그램을 수정하는 것을 잊었다면 발각될 수 있습니다(예: 프로그램을 수정했지만 top수정하지 않은 경우 htop). 그렇지 않을 가능성이 높지만 후회하는 것보다 안전을 유지하는 것이 좋습니다.

관련 정보