`[자바]` 죽은 자녀와 함께 -> 수집할 수 있는 방법이 있나요?

`[자바]` 죽은 자녀와 함께 -> 수집할 수 있는 방법이 있나요?

질문과 관련:"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는평범한 좀비.좀비는 수가 많아지면 위험해지기 때문에 구석에 배치하고 다음에 다시 시작할 때 처리하면 됩니다.

관련 정보