<defunct> 프로세스 란 무엇이며 왜 종료되지 않습니까?


180

크롬 브라우저는 반응이 없어서 죽이려고했지만 프로세스가 사라지는 대신 <defunct>오른쪽에 있었고 죽지 않았습니다.

여기에 이미지 설명을 입력하십시오

<defunct>프로세스 란 무엇 이며 왜 프로세스가 종료되지 않습니까?


3
허용 된 답변은 " kill -9 PID작동하지 않습니다 "라고 언급합니다 . 부분적으로는 사실입니다. 실제로 NO kill은 작동하지 않습니다. 또한 -9를 최후의 수단으로 사용해야합니다. 99 %의 시간 동안 부모 프로세스를 기본으로 강제 종료하면 프로세스가 종료되고 모든 자식을 거두게됩니다. "기본 킬"은 SIGTERM (-15)입니다. -9 (SIGKILL)의 팬들이 stackoverflow.com/questions/690415/…
Mike S

답변:


172

출력 결과에 "defunct"가 표시되는데, 이는 프로세스가 작업을 완료했거나 손상되었거나 종료되었지만 하위 프로세스가 여전히 실행 중이거나 이러한 상위 프로세스가 하위 프로세스를 모니터링하고 있음을 의미합니다. 이런 종류의 프로세스를 종료하려면 kill -9 PID가 작동하지 않습니다. 이 명령으로 그들을 죽일 수는 있지만 이것을 반복해서 보여줄 것입니다.

이 소멸 된 프로세스의 상위 프로세스를 판별하고 종료하십시오. 이것을 알고 싶다면 다음 명령을 실행하십시오 :

ps -ef | grep defunct

UID          PID     PPID       C    STIME      TTY          TIME              CMD
1000       637      27872      0   Oct12      ?        00:00:04 [chrome] <defunct>
1000      1808      1777       0    Oct04     ?        00:00:00 [zeitgeist-datah] <defunct>

그런 kill -9 637 27872다음 사용하지 않는 프로세스가지나 갔는지 확인하십시오 ps -ef | grep defunct.


13
"defunct"프로세스를 종료 할 수 없습니다. 상위를 종료하면 프로세스 테이블에서 해당 항목을 빠르게 삭제할 수 있습니다.
jfs

57
ppid가 1( init) 이면 어떻게 됩니까? 기다릴 필요가 있다고 가정합니까?
Luc

7
킬을 자동화하기 위해, 당신도 역시 이것을 할 수 있습니다 (출력에서 자르고있는 바이트를 변경해야 할 수도 있습니다) :ps -ef | grep defunct | grep -v grep | cut -b8-20 | xargs kill -9
warren

3
@warren 감사합니다. 당신은 또한 두번째 grep을하지 않음으로써 약간 더 짧고 (imo) 더 단순하게 만들 수 있습니다. 첫 번째 grep을 grep [d]efunct비슷하게 변경하면 일치하지 않습니다.
Thor84no

4
@warren은 SIGKILL을 사용하더라도 기능 중단 프로세스를 죽일 수 없습니다. 또한 kill -9를 무차별 적으로 사용하고 있습니다. stackoverflow.com/questions/690415/…를 참조하십시오 . 소외된 어린이를 죽이고 싶다면 다음을 시도해보십시오 parents_of_dead_kids=$(ps -ef | grep [d]efunct | awk '{print $3}' | sort | uniq | egrep -v '^1$'); echo "$parents_of_dead_kids" | xargs kill.. kill -9원하는 경우 30 초 정도 후에 스크립트를 다시 실행하십시오 . (나는 특별히 살인을 허용하지 않음에 유의하십시오 Init)
Mike S

60

매뉴얼 페이지 ps (1) :

표시된 프로세스 <defunct>는 부모가 프로세스를 제대로 파괴하지 않았기 때문에 남아 있는 죽은 프로세스 (소위 "좀비" )입니다. 이러한 프로세스는 init(8)상위 프로세스가 종료되면 제거됩니다.

이미 죽었 기 때문에 죽일 수 없습니다. 남은 것은 프로세스 테이블의 항목입니다 .

Unix 및 Unix와 유사한 컴퓨터 운영 체제에서 좀비 프로세스 또는 기능 취소 프로세스는 실행이 완료되었지만 프로세스 테이블에 여전히 항목이있는 프로세스입니다. 이 항목은 부모 프로세스가 자식의 종료 상태를 읽을 수 있도록 여전히 필요합니다.

그러한 프로세스가 많지 않으면 그러한 프로세스를 허용하는 데 아무런 해가 없습니다. 좀비는 결국 부모에 의해 거두어집니다 ( wait(2)). 원래 부모가 자체 종료 전에 그것을 얻지 못하면 init프로세스 ( pid == 1)는 나중에 수행합니다. 좀비 프로세스 는 다음과 같습니다.

종료 상태가 해당 프로세스의 종료를 기다리는 다른 프로세스에보고되면 종료되고 삭제 된 프로세스입니다.


1

감사합니다 Mike S. 우리는 당신의 라인을 가지고 부모가 in.telnetd 인 소멸 된 프로세스를 죽일 스크립트를 작성했습니다. 우리는 부모 프로세스를 죽이기를 원하지 않고 단지 문제를 일으키는 것으로 알려진 telnetd를 필요로하며 필요한 경우 여러 프로세스를 죽이기 위해 여러 번 실행합니다.

# egrep -v '^1$ = Make sure the process is not the init process.
# awk '{print $3}' = Print the parent process.

first_parent_of_first_dead_kid=$(ps -ef | grep [d]efunct | awk '{print $3}' | head -n1 | egrep -v '^1$')
echo "$first_parent_of_first_dead_kid"

# If the first parent of the first dead kid is in.telnetd, then kill it.
if ps -ef | grep $first_parent_of_first_dead_kid | grep in.telnetd;then
        echo "We have a defunct process whose parent process is in.telnetd" | logger -t KILL-DEFUNCT-TELNET
        echo "killing $first_parent_of_first_dead_kid" | logger -t KILL-DEFUNCT-TELNET
        kill $first_parent_of_first_dead_kid 2>&1 | logger -t KILL-DEFUNCT-TELNET
fi

1

패딩턴의 대답을 확장 ..

출력 결과에 defunct 가 표시됩니다. 이는이 하위 프로세스가 작업을 완료했거나 손상되었거나 종료되었음을 의미합니다 . 부모 프로세스가 여전히 실행 중이며 죽은 자식을 발견하지 못했습니다.

kill -9 PID 작동하지 않습니다 (이미 죽었습니다).

이 하위 프로세스의 상위를 판별하려면 다음 명령을 실행하십시오.

ps -ef | grep defunct

 UID  PID **PPID** C STIME TTY TIME     CMD
 1000 637  27872   0 Oct12 ?   00:00:04 [chrome] <defunct>

부모님이 누구인지보십시오 : ps ax | grep 27872

당신이 원한다면 당신은 부모를 죽일 수 있고, 기능 부족은 사라질 것입니다. kill -9 27872

보다 기술적 추론에 대해서는 JF Sebastian의 답변을 참조하십시오.


1

@ 패딩턴 (Paddington)의 답변에 덧붙여, 빠른 확인을 위해이 기능을 bashrc에 추가했습니다.

defunct(){
    echo "Children:"
    ps -ef | head -n1
    ps -ef | grep defunct
    echo "------------------------------"
    echo "Parents:"
    ppids="$(ps -ef | grep defunct | awk '{ print $3 }')"
    echo "$ppids" | while read ppid; do
        ps -A | grep "$ppid"
    done
}

다음과 같이 출력됩니다.

어린이:
UID PID PPID C STIME TTY 시간 CMD
사용자 25707 25697 0 Feb26 pts / 0 00:00:00 [sh] 
사용자 30381 29915 0 11:46 pts / 7 00:00:00 grep defunct
------------------------------
부모님:
25697 점 / 0 00:00:00 npm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.