좀비 프로세스를 찾는 방법?


100
System information as of Fri Mar  9 19:40:01 KST 2012

  System load:    0.59               Processes:           167
  Usage of /home: 23.0% of 11.00GB   Users logged in:     1
  Swap usage:     0%                 IP address for eth1: 192.168.0.1

  => There is 1 zombie process.

  Graph this data and manage this system at https://landscape.canonical.com/

10 packages can be updated.
4 updates are security updates.

Last login: Fri Mar  9 10:23:48 2012
a@SERVER:~$ ps auxwww | grep 'Z'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
usera     13572  0.0  0.0   7628   992 pts/2    S+   19:40   0:00 grep --color=auto Z
a@SERVER:~$ 

좀비 프로세스를 찾는 방법?


왜 시스템 모니터를 열고 좀비 프로세스를 검색하지 않습니까?
dlin

8
헤드리스 no-X 서버에서 어떻게합니까?
SabreWolfy

2
놀랍게도 아래의 대답이 실제로는 위의 출력을 기반으로 시스템에 좀비 프로세스가 없다고 말합니다. 실제로 존재하는 경우 ps auxwww | grep 'Z'명령은 Z상태 의 프로세스를 보여 주어야합니다 . 말하는 "시스템 정보" => There is 1 zombie process.는 버그 인 것 같습니다. 그 중 하나이거나 질문에 누락 된 정보가 있습니다.
arielf

답변:


126

좀비 (프로세스)를 죽이려면 부모 프로세스 (실제 좀비처럼)를 죽여야하지만 문제는 그것을 찾는 방법이었습니다.

좀비를 찾으십시오 (질문 이이 부분에 답했습니다).

a@SERVER:~$ ps aux | grep 'Z'

당신이 얻는 것은 Zombies와 Z가 들어있는 다른 것이므로 grep도 얻습니다.

USER       PID     %CPU %MEM  VSZ    RSS TTY      STAT START   TIME COMMAND
usera      13572   0.0  0.0   7628   992 pts/2    S+   19:40   0:00 grep --color=auto Z
usera      93572   0.0  0.0   0      0   ??       Z    19:40   0:00 something

좀비의 부모를 찾으십시오.

a@SERVER:~$ pstree -p -s 93572

당신에게 줄 것이다 :

init(1)---cnid_metad(1311)---cnid_dbd(5145)

이 경우 부모 프로세스를 종료하고 싶지 않으며 좀비에 만족해야하지만 직계 부모 프로세스 5145를 종료하면 제거됩니다.

askubuntu에 대한 추가 리소스 :


1
답변에 표시되는 결과는 좀비 프로세스가 아니라 grep 명령 자체입니다. 파블로가 대답 한 것과 같은 잘못된 해석입니다. 아래 Rinzwind의 답변은 실제로 좀비 프로세스를 찾아서 나열합니다. 또 다른 옵션은 "defunct"를 grep하는 것입니다.
FvD

pstree -H your_desired_pid -p
Greg M. Krsak

토론에 도움을 준 Greg에게 감사를 표하지만이 사이트는 도움말 사이트라는 것을 기억하십시오. 아무 것도 설명하지 않고 명령을 붙여 넣는 것은 여기에 도움을 구하는 대부분의 사람들에게 도움이되지 않습니다.
Duncanmoo

1
이것은 좋은 답변입니다! 오늘도 유효합니다! 좀비 프로세스를 찾아서 아무런 문제없이 부모 프로세스를 죽일 수있었습니다. 감사합니다!
Terrance

1
pstree가 설치되어 있지 않은 경우에도 ps wauxf마찬가지입니다.
JDS

35

이 질문이 오래되었지만 모든 사람들 이보다 신뢰할만한 대답을해야한다고 생각했습니다.

ps axo pid=,stat=

이것은 공백으로 구분 된 두 개의 열을 방출합니다. 첫 번째 열은 PID이고 두 번째 열은 상태입니다.

GNU조차도 ps국가별로 직접 필터링 할 수있는 방법을 제공하지는 않지만 신뢰할 수있는 방법 으로이 작업을 수행 할 수 있습니다awk

ps axo pid=,stat= | awk '$2~/^Z/ { print }'

이제 좀비 인 PID 목록이 있습니다. 상태를 알고 있으므로 더 이상 표시 할 필요가 없으므로 필터링 할 수 있습니다.

ps axo pid=,stat= | awk '$2~/^Z/ { print $1 }'

줄 바꿈으로 구분 된 좀비 PID 목록을 제공합니다.

이제 간단한 쉘 루프로이 목록에서 작업 할 수 있습니다

for pid in $(ps axo pid=,stat= | awk '$2~/^Z/ { print $1 }') ; do
    echo "$pid" # do something interesting here
done

ps 강력한 도구이므로 프로세스 정보를 얻기 위해 복잡한 작업을 수행 할 필요가 없습니다.

(여기에서 다른 프로세스 상태의 의미-https: //unix.stackexchange.com/a/18477/121634 )


2
awk또한 텍스트를 분할 할뿐만 아니라 일치시킬 수있는 강력한 도구입니다. +1 ... 다른 사람들 grep은 불필요하고 부정확 한 곳에 사용 했습니다.
0xC0000022L 12

이제 좀비 프로세스 목록이 생겼습니다. 어떻게 그들을 죽일까?
chovy

@ chovy : 그것은 의존하지만 일반적으로 부모를 죽이거나 신호하는 것을 포함합니다. 다른 답변은 여기에 있습니다. 위의 루프에서 다음과 같은 부모 pid를 찾을 수 있습니다.ps -p "$pid" -opid=,ppid=
Sorpigal

부모가 자식 프로세스를 모두 죽이지 않을까요? 하나의 좀비 프로세스를 죽이고 싶습니다. 나는 바보를 안다.
chovy

1
ppid=옵션 목록 에 추가 하도록 제안 하므로 ppid를 얻기 위해 별도의 명령을 사용할 필요가 없습니다.
Ding-Yi Chen

3

ps aux | awk '{ print $8 " " $2 }' | grep -w Z

보낸 사람 : http://www.cyberciti.biz/tips/killing-zombie-process.html

의견에서 개선 된 것 :

for p in $(ps jauxww | grep Z | grep -v PID | awk '{print $3}'); do
    for every in $(ps auxw | grep $p | grep cron | awk '{print $2}'); do
        kill -9 $every;
    done;
done;

조심하십시오 : 이것도 프로세스를 죽입니다.


여전히 아무것도 반환하지 않습니다. 내 방식도 틀렸다고 생각합니다.
Pablo

두 번째 예는 지옥처럼 믿을 수 없으며 전자는 불필요하게 장황합니다 ( ps axo pid=,stat= | awk '$2~/Z/ {print $1}'대신 시도하십시오 ).
Sorpigal

3

더 적을수록 :

ps afuwwx | less +u -p'^(\S+\s+){7}Z.*'

즉, 모든 사용자 프로세스의 포리스트 (트리)를 tty에서 무제한 너비를 가진 사용자 지향 형식으로 제공하고 8 번째 열에 Z가 포함 된 경우와 일치하는 위 화면의 절반에서 나에게 보여주십시오. 왜 전체 라인을 강조하지 않습니까?

사용자 지향 형식은 다음과 같습니다 USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND. 좀비 상태가 8 번째 열에 표시됩니다.

라인 번호를 원한다면 N앞에 pa를, 그리고 J경기에서 별표를 원한다면 a를 던질 수 있습니다 . 슬프게도 G별표가 표시되지 않는 줄을 강조 표시하지 않으면 J공간이 만들어집니다.

결국 다음과 같은 것을 얻습니다.

…
  root      2919  0.0  0.0  61432  5852 ?      Ss Jan24 0:00 /usr/sbin/sshd -D
  root     12984  0.0  0.1 154796 15708 ?      Ss 20:20 0:00  \_ sshd: lamblin [priv]
  lamblin  13084  0.0  0.0 154796  9764 ?      S  20:20 0:00      \_ sshd: lamblin@pts/0
* lamblin  13086  0.0  0.0  13080  5056 pts/0  Z  20:20 0:00          \_ -bash <defunct>
  lamblin  13085  0.0  0.0  13080  5056 pts/0  Ss 20:20 0:00          \_ -bash
  root     13159  0.0  0.0 111740  6276 pts/0  S  20:20 0:00              \_ su - nilbmal
  nilbmal  13161  0.2  0.0  13156  5004 pts/0  S  20:20 0:00                  \_ -su
  nilbmal  13271  0.0  0.0  28152  3332 pts/0  R+ 20:20 0:00                      \_ ps afuwwx
  nilbmal  13275  0.0  0.0   8404   848 pts/0  S+ 20:20 0:00                      \_ less +u -Jp^(\S+\s+){7}Z.*
…

당신은 와 함께이 후속 (그리고 터미널이 -U 유니 코드 또는 -A 아스키를 좋아하는 경우에 감지 것이다) :

pstree -psS <PID LIST>

또는 위쪽 화살표 less를 사용하여 계층을 통해 해당 트리 / 숲을 따라갑니다. 이것이 "더 적을수록 좋습니다"접근 방식으로 추천 한 것입니다.


0

나는 당신 에게이 명령을 제안합니다 :

ps aux | awk '"[Zz]" ~ $8 { printf("%s, PID = %d\n", $8, $2); }'

원하는 것을 정확하게 aux사용 -o하고 요청할 수있을 때 문자열을 사용 하고 제거하는 것은 불필요하게 신뢰할 수 없습니다 . ps ax -o pid=,stat= | awk '$2 ~ "[Zz]" { printf("%s, PID = %d\n", $2, $1); }'대신 사용하십시오 .
Sorpigal

-1

프로세스 좀비를 나열하려면 다음 명령을 시도하십시오.

ps j | awk '$7 ~ "Z"'

$7운영 체제에 따라 변경해야 할 수도 있습니다.

또한 부모 프로세스 ID 목록 ( PPID) 을 반환합니다 .

위의 명령을 테스트 한 후 좀비를 죽이려면 다음을 시도하십시오.

kill -9 $(ps j | awk 'NR>1 && $7 ~ "Z" {print $2}')

부모를 확인하려면 다음과 pstree같이 시도하십시오 .

$ ps j | awk 'NR>1 && $7 ~ "T" {print $2}' | xargs -L1 pstree -sg
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2430)
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2431)
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2432)

이를 위해 하나의 열을 j포맷에서 제거하는 것은 불필요하게 복잡합니다. 사용 -o대신 원하는 것을 선택할 수 있습니다.
Sorpigal

2
ps j시스템의 모든 프로세스를 인쇄하지는 않습니다. 현재 사용자 procs 만 나열하므로 (BSD 작업 스타일) 좀비 프로세스가 누락 될 수 있습니다.
arielf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.