부모와 함께 <defunct> 프로세스를 종료하는 방법 1


17

RedHat 상자에서 Bacula를 실행하고 있습니다. 때때로 스토리지 데몬 bacula-sd가 작동을 중지하고이됩니다 <defunct>.

[root@backup ~]# ps -ef | grep defunct | more
root      4801 29261  0 09:25 pts/5    00:00:00 grep defunct
root      5825     1  0 Oct18 ?        00:00:00 [bacula-sd] <defunct>

내 질문은 어떻게이 프로세스를 죽일 수 있습니까? 부모는 1이며, 내가 아는 한 init이며 init 프로세스를 죽이고 싶지 않습니까?

일반적으로이 프로세스를 종료하면 작동하지 않습니다.

[root@backup ~]# kill -0 5825
[root@backup ~]# kill -9 5825

도움을 주셔서 감사합니다!

편집 : 달리기

[root@backup ~]# lsof -p 5825

다음과 같은 출력을 생성합니다.

COMMAND    PID USER   FD   TYPE  DEVICE     SIZE    NODE NAME
bacula-sd 5825 root  cwd    DIR   253,0     4096 3801089 /root
bacula-sd 5825 root  rtd    DIR   253,0     4096       2 /
bacula-sd 5825 root  txt    REG   253,0  2110599  368004 /usr/local/sbin/bacula-sd
bacula-sd 5825 root  mem    REG   253,0    75284  389867 /usr/lib/libz.so.1.2.3
bacula-sd 5825 root  mem    REG   253,0    46680 3604521 /lib/libnss_files-2.5.so
bacula-sd 5825 root  mem    REG   253,0   936908  369115 /usr/lib/libstdc++.so.6.0.8
bacula-sd 5825 root  mem    REG   253,0   125736 3606807 /lib/ld-2.5.so
bacula-sd 5825 root  mem    REG   253,0  1602128 3606885 /lib/libc-2.5.so
bacula-sd 5825 root  mem    REG   253,0   208352 3606892 /lib/libm-2.5.so
bacula-sd 5825 root  mem    REG   253,0   125744 3606887 /lib/libpthread-2.5.so
bacula-sd 5825 root  mem    REG   253,0    25940 3604573 /lib/libacl.so.1.1.0
bacula-sd 5825 root  mem    REG   253,0    15972 3604535 /lib/libattr.so.1.1.0
bacula-sd 5825 root  mem    REG   253,0    46548 3606908 /lib/libgcc_s-4.1.2-20080102.so.1
bacula-sd 5825 root  mem    REG   253,0 56422480  366368 /usr/lib/locale/locale-archive
bacula-sd 5825 root    0r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    1r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    2r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    3u   CHR   9,128             6469 /dev/nst0
bacula-sd 5825 root    4u  IPv4 1023380              TCP backup:bacula-sd (LISTEN)
bacula-sd 5825 root    5u  IPv4 2693268              TCP backup:bacula-sd->backup:53957 (CLOSE_WAIT)
bacula-sd 5825 root    7u  IPv4 3248683              TCP backup:bacula-sd->backup:57629 (CLOSE_WAIT)
bacula-sd 5825 root    8u  IPv4 3250966              TCP backup:bacula-sd->backup:37650 (CLOSE_WAIT)
bacula-sd 5825 root    9u  IPv4 3253908              TCP backup:bacula-sd->backup:37671 (CLOSE_WAIT)

답변:


18

좀비 / 비 기능 프로세스를 제거 할 수있는 유일한 방법은 부모를 죽이는 것입니다. 부모는 init (pid 1)이므로 시스템을 중단시킵니다.

이것은 두 가지 옵션을 제공합니다.

  • 프로세스 테이블을 수동으로 수정하십시오 (예 : 더미 프로세스를 생성하고, 삭제 된 프로세스를 더미의 자식으로 연결 한 다음 제거하십시오. 매우 위험하므로 세마포어 및 파일 핸들과 같은 다른 프로세스 리소스를 수동으로 정리해야 할 수도 있습니다.
  • 시스템을 재부팅하십시오.

나는 두 번째와 함께 갈 것입니다.


2
+1. 그러나 더 많은 좀비 프로세스가 표시되지 않거나 좀비 프로세스가 RAM의 4G를 잠그지 않은 경우에는 서두를 필요가 없습니다. :)
Kyle Smith

1
"부모는 init (pid 1)이므로 시스템을 중단시킬 수 있습니다" init-SIGKILL에 대한 신호 처리기가 없으므로 종료 할 수 없습니다 . 참조하십시오 man 2 kill.
Cawflands

먼저 어떻게합니까?
skerit 2019

@AndrewH SIGKILL이 대상 프로세스의 신호 처리기에 의존하는지 확실하지 않지만 일반적인 커널은 초기화하기 위해 SIGKILL을 무시합니다. 그러나 커널 패닉을 유발할 수있는 더 멋진 방법이 없다면 대부분의 Linux 시스템에서 SIGSEGV가 상당히 훌륭하게 작동 할 것입니다.
Roy

1
init의 작업 중 하나는 좀비 프로세스를 거두는 것이므로 오래 기다리면 init좀비 프로세스를 정리해야합니다. 그럼에도 불구하고 대부분 init의 핸들러는 SIGCHLDSIG_IGN 를 수정 하는 핸들러를 설정해야 합니다.
cyphar

3

init를 다시 시작해 볼 수 있습니다.

 # telinit u

그렇지 않으면 너무 걱정하지 않을 것입니다. 실행 중이 아니며 리소스를 사용하지 않으며 커널이 기억할 수 있도록 바로 거기에 있습니다.


1
글쎄, 나는 걱정해야한다. 백업 (bacula) 및 voip (asterisk) 서비스를 실행하는 프로덕션 시스템입니다. 소실 된 bacula-sd 프로세스가 존재하는 한, bacula는 테이프 드라이브에 액세스 할 수없는 것 같습니다.
andreas-h

파일이 열려 있지 않아야합니다. lsof -p 5825를 실행하고 확인하십시오.
David Pashley

글쎄, 많은 것들이 열려있는 것 같습니다 ... 위를 참조하십시오. 내가 할 수있는 아이디어가 있습니까? 나는 ... lsof를 사용 적이
안드레아스-H

1
예, 좀비가 / dev / nst0을 열었습니다. 이 시점에서 시스템 재부팅이 가장 좋습니다.
Kyle Smith

5
그렇습니다. 재부팅이 일반적인 대답 인 것 같습니다. 서버를 재부팅해야 할 때 항상 실패한 것 같습니다. :(
David Pashley

3

커널 패닉이 있는지 확인하십시오.

# dmesg |tail

프로세스가 "D"Unkillable sleep 상태인지 확인하십시오. 여기서 커널 모드에서 아직 반환되지 않은 일부 syscall (커널 oop 또는 다른 이유)에 대해서는 http://www.nabble.com/What-causes-an -unkillable-process--td20645581.html


성가신 서식
asdmin

실제로 커널 패닉이 없습니다. 프로세스는 'Z'상태에 있습니다-좀비 ...
andreas-h

3

좀비가 부모로서 초기화 된 경우, 초기화가 제대로 작동하지 않습니다. init의 역할 중 하나는 좀비를 정리하는 것입니다. 그렇게하지 않으면 다른 사람은하지 않을 것입니다. 따라서 유일한 해결책은 재부팅하는 것입니다. 초기화가 실패하면 재부팅이 실패 할 수 있으므로 중요한 서비스를 종료하고 파일 시스템을 동기화 한 다음 전원 버튼을 누르십시오.


init이 제대로 작동하지 않는 것에 동의합니다. 참조 : upstartsystemd.
Mikko Rantalainen

2

공황 상태를 유지합시다. "기능 상실"또는 "좀비"프로세스 프로세스 가 아닙니다 . 저장된 종료 코드가있는 프로세스 테이블의 항목입니다. 따라서 좀비는 프로세스가 아니기 때문에 리소스를 보유하지 않고 CPU주기를 사용하지 않으며 메모리를 사용하지 않습니다 . 좀비 프로세스를 "죽이려고"모든 이상하고 가려워하지 마십시오. 그들의 이름과 마찬가지로, 그들은 이미 죽었 기 때문에 죽을 수 없습니다. 그러나 두뇌를 먹는 종류와는 달리 그들은 아무도 해를 끼치 지 않으며 다른 과정을 물지 않습니다.

좀비 프로세스가 뇌를 먹지 못하게하십시오. 그냥 무시하십시오.


11
그렇습니다, 그것은 이론입니다. 불행히도 항상 사실은 아닙니다. andreash가 명확하게 문서화 한 것처럼 기능이없는 프로세스가 때때로 시스템 자원에 매달리게됩니다.
Roy

5
그의 경우 lsof 출력에 따라 좀비 프로세스는 / dev / nst0의 두뇌를 먹는 것입니다. 그는 백업 작업을 계속하려면 이러한 두뇌가 필요합니다.
Kyle Smith

2
좀비 프로세스를 무시하고 경력을 쌓은 시스템 관리자는 결국 한밤중에 깨어나 생명을 빼앗길 것입니다. 좀비는 내 경험상 무언가 잘못되었음을 나타냅니다. 좀비 아이가 부모와 이상한 상호 작용을하고 부모가 내 CPU를 돌리고 있기 때문에 이것을 씁니다. 나는 그것이 누구의 잘못인지 모르겠지만 요점은 좀비가 못 생겼으며 그것을 무시하면 언젠가 당신을 괴롭힐 것입니다. ... 어느 날 ... 당신은 평화롭게 자고있을 때 ... 한밤중에 ... 추운 가을날 후에 ...
Mike S

@MikeS 나는 당신의 의견에서 좋은 웃음을 얻었다!
Paul Calabro

@MikeS가 옳습니다. ssh-agent defunct가 있고 ssh 또는 git이 제대로 실행될 수 없습니다. 다시 시작할 때만 도움이 될 수 있습니다. (창과 같은 수정은 ... haha)
John Tribe

0

고아 프로세스가있는 것 같습니다. 내가 아는 한이를 죽이는 유일한 방법은 상자를 재부팅하는 것입니다. 나는 때때로 ESX 서버 (이것은 리눅스)에서 발생했으며 호스트 재부팅은 (VMware 지원의) 수정입니다.

나는 Windows 녀석이므로 그만한 가치가 있다고 생각하십시오.


불행히도, 재부팅은 실제 옵션이 아닙니다. 내가 근무 시간 중에 재부팅 할 수 있도록 생산 기계는 또한 VoIP 서비스를 실행의 ...
안드레아스-H

1
근무 시간 후에 다시 부팅 할 수 있습니다.
warren
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.