크롬 브라우저는 반응이 없어서 죽이려고했지만 프로세스가 사라지는 대신 <defunct>
오른쪽에 있었고 죽지 않았습니다.
<defunct>
프로세스 란 무엇 이며 왜 프로세스가 종료되지 않습니까?
크롬 브라우저는 반응이 없어서 죽이려고했지만 프로세스가 사라지는 대신 <defunct>
오른쪽에 있었고 죽지 않았습니다.
<defunct>
프로세스 란 무엇 이며 왜 프로세스가 종료되지 않습니까?
답변:
출력 결과에 "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
.
1
( init
) 이면 어떻게 됩니까? 기다릴 필요가 있다고 가정합니까?
ps -ef | grep defunct | grep -v grep | cut -b8-20 | xargs kill -9
grep [d]efunct
비슷하게 변경하면 일치하지 않습니다.
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
)
표시된 프로세스
<defunct>
는 부모가 프로세스를 제대로 파괴하지 않았기 때문에 남아 있는 죽은 프로세스 (소위 "좀비" )입니다. 이러한 프로세스는init(8)
상위 프로세스가 종료되면 제거됩니다.
이미 죽었 기 때문에 죽일 수 없습니다. 남은 것은 프로세스 테이블의 항목입니다 .
Unix 및 Unix와 유사한 컴퓨터 운영 체제에서 좀비 프로세스 또는 기능 취소 프로세스는 실행이 완료되었지만 프로세스 테이블에 여전히 항목이있는 프로세스입니다. 이 항목은 부모 프로세스가 자식의 종료 상태를 읽을 수 있도록 여전히 필요합니다.
그러한 프로세스가 많지 않으면 그러한 프로세스를 허용하는 데 아무런 해가 없습니다. 좀비는 결국 부모에 의해 거두어집니다 ( wait(2)
). 원래 부모가 자체 종료 전에 그것을 얻지 못하면 init
프로세스 ( pid == 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
패딩턴의 대답을 확장 ..
출력 결과에 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의 답변을 참조하십시오.
@ 패딩턴 (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
kill -9 PID
작동하지 않습니다 "라고 언급합니다 . 부분적으로는 사실입니다. 실제로 NO kill은 작동하지 않습니다. 또한 -9를 최후의 수단으로 사용해야합니다. 99 %의 시간 동안 부모 프로세스를 기본으로 강제 종료하면 프로세스가 종료되고 모든 자식을 거두게됩니다. "기본 킬"은 SIGTERM (-15)입니다. -9 (SIGKILL)의 팬들이 stackoverflow.com/questions/690415/…