질문과 관련:"kill -9"가 작동하지 않으면 어떻게 되나요?
나는 다음과 같은 상황에 처해 있습니다.스레드된 좀비 프로세스는 init에 의해 수집되지 않습니다.:
[root@Arch64]# ps auxH | grep java
gwpl 569 0.0 0.0 0 0 ? Zl 04:23 0:00 [java] <defunct>
gwpl 569 5.5 49.0 1466648 375572 ? Rl 07:25 23:55 [java] <defunct>
gwpl 569 16.0 49.0 1466648 375572 ? Rl 12:27 20:54 [java] <defunct>
gwpl 569 17.9 49.0 1466648 375572 ? Rl 12:47 19:48 [java] <defunct>
root 10466 0.0 0.0 6740 628 pts/0 S+ 14:38 0:00 grep java
[root@Arch64]# pstree -s 569
init---java---3*[{java}]
내가 할 수 있는게 있습니까?
또는내부에댓글에 제안된 버그https://unix.stackexchange.com/a/11173/9689?
이것이 버그라면 무엇을 버려서 해결해야 합니까?
위 목록에서는 다음 상태 코드를 사용합니다: Zl
, Rl
, S+
. man ps
디코딩을 위한 치트 시트 는 다음과 같습니다 .
PROCESS STATE CODES
(...)
R Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
(...)
Z Defunct ("zombie") process, terminated but not reaped by its parent.
For BSD formats and when the stat keyword is used, additional characters may be displayed:
(...)
L has pages locked into memory (for real-time and custom IO)
(...)
+ is in the foreground process group
답변1
아마도 좋은 일을 하기에는 너무 늦었을 것입니다. 하지만 프로세스 569가 될 수 있는지 궁금합니다.아니요완전 좀비네요. 아마도 초기 스레드가 종료되었지만 다른 스레드가 여전히 실행 중일 때 해당 OS(어떤 OS입니까?)에서 얻을 수 있는 결과일 것입니다. 그렇다면 kill(1)
여전히 유효해야합니다. 그렇지 않다면 다음으로 시도할 것은tgkill(2)
, 또는 운영 체제와 동등한 항목을 R 상태에 나열된 스레드에서 실행합니다(이러한 시스템 호출을 호출하기 위한 사전 설치된 셸 유틸리티가 없을 수 있으므로 일부 C를 작성해야 합니다).
또한 프로세스에 연결하거나 연결하려고 하면 진단에 유용한 일부 정보가 드러날 수 있습니다 strace
.gdb
좀비를 수확할 때 버그가 있을 가능성은 거의 없습니다 init
. 버그라면 버그일 가능성이 더 높습니다.핵심다중 스레드 프로세스에서 오류가 올바르게 처리되지 않습니다(특정 상황에서).
답변2
초기화는 항상 기다립니다.속담처럼. 따라서 커널에 버그가 발생할 가능성은 매우 적습니다. 프로세스 569의 ppid는 무엇입니까? ps -alef
이것을 제공할 것입니다. 또는 BSD 관점이 있는 경우 ps axo stat,pid.ppid,comm
상위 프로세스가 초기화되지 않은 경우 569는평범한 좀비.좀비는 수가 많아지면 위험해지기 때문에 구석에 배치하고 다음에 다시 시작할 때 처리하면 됩니다.