재부팅하지 않고 죽일 수없는 프로세스를 종료하는 방법은 무엇입니까?


11

5 개의 프로세스가 종료 될 수 kill -9 $PID있으며 실행 cat /proc/$PID/cmdline하면 현재 세션이 중단됩니다. 아마도 그들은 좀비 프로세스 일 것입니다.

실행 ps -ef or htop하면 현재 세션이 중단됩니다. 그러나 topps -e벌금을 노력하고 있습니다.

따라서 파일 시스템이 응답하지 않는 두 가지 문제가있는 것 같습니다.

가상 머신을 실행하는 프로덕션 머신이므로 재부팅은 옵션이 아닙니다.

다음 프로세스 ID가 작동하지 않습니다. 16181 16765 5985 7427 7547

이 프로세스의 부모는 init입니다

        ├─collectd(16765)─┬─{collectd}(16776)
        │                 ├─{collectd}(16777)
        │                 ├─{collectd}(16778)
        │                 ├─{collectd}(16779)
        │                 ├─{collectd}(16780)
        │                 └─{collectd}(16781)
        ├─collectd(28642)───{collectd}(28650)
        ├─collectd(29868)─┬─{collectd}(29873)
        │                 ├─{collectd}(29874)
        │                 ├─{collectd}(29875)
        │                 └─{collectd}(29876)

그리고 qemu 프로세스 중 하나가 작동하지 않습니다

|-qemu-system-x86(16181)-+-{qemu-system-x86}(16232)
|                        |-{qemu-system-x86}(16238)
|                        |-{qemu-system-x86}(16803)
|                        |-{qemu-system-x86}(17990)
|                        |-{qemu-system-x86}(17991)
|                        |-{qemu-system-x86}(17992)
|                        |-{qemu-system-x86}(18062)
|                        |-{qemu-system-x86}(18066)
|                        |-{qemu-system-x86}(18072)
|                        |-{qemu-system-x86}(18073)
|                        |-{qemu-system-x86}(18074)
|                        |-{qemu-system-x86}(18078)
|                        |-{qemu-system-x86}(18079)
|                        |-{qemu-system-x86}(18086)
|                        |-{qemu-system-x86}(18088)
|                        |-{qemu-system-x86}(18092)
|                        |-{qemu-system-x86}(18107)
|                        |-{qemu-system-x86}(18108)
|                        |-{qemu-system-x86}(18111)
|                        |-{qemu-system-x86}(18113)
|                        |-{qemu-system-x86}(18114)
|                        |-{qemu-system-x86}(18119)
|                        |-{qemu-system-x86}(23147)
|                        `-{qemu-system-x86}(27051)

1
좀비 프로세스는 문제를 일으키지 않아야합니다. Zombie 프로세스 수가 너무 많아 서버의 프로세스 제한을 초과하면 문제가 발생합니다.
Raza

@Salton : ps -ef와 htop을 사용할 수 없어서 몇 가지 문제가 있습니다. 아마도 우리가보고있는 것을 좀비 프로세스라고하지 않습니까?
Sam Stoelinga 5

1
/usr/bin/strace ps -ef정확히 어디에 ps -ef걸려 있는지 확인 하기 위해을 사용하여 추적을 시도 할 수 있습니다 .
Raza

2
이들은 좀비를 어떻게 결정 했습니까? 오히려 프로세스가 중단되는 것처럼 보입니다. ps -el이러한 프로세스는 어떤 상태 에서 작동 합니까 ?
Nils

결국 클라이언트는 문제가 계속 악화되면서 시스템을 재부팅하기로 결정했습니다. 모든 입력에 감사드립니다. 좀비와 상호 운용 할 수없는 프로세스에 대해 많이 배웠습니다.
Sam Stoelinga

답변:


22

당신은 좀비가 없습니다. cat /proc/$PID/cmdline좀비에 아무런 문제가 없습니다. 경우 kill -9프로그램을 제거하지 않습니다 , 그것은 프로그램이 일부 무정전 I / O 작업을하고있는 것을 의미한다. 일반적으로 다음 세 가지 중 하나를 나타냅니다.

  • 응답하지 않는 네트워크 파일 시스템;
  • 커널 버그;
  • 하드웨어 버그.

ps커널이 위와 같은 이유로 제공하지 않는 프로세스 실행 경로와 같은 일부 정보를 읽으려고 할 때 와 같은 유틸리티 가 중단 될 수 있습니다.

시도 cat /proc/16181/syscall16,181이 무엇을하는지 과정을 볼 수 있습니다. 시스템의 거리에 따라 작동하지 않을 수도 있습니다.

문제가 네트워크 파일 시스템 인 경우 강제 마운트 해제하거나 온라인 상태로 만들 수 있습니다. 문제가 커널 또는 하드웨어 버그 인 경우 버그의 특성에 따라 수행 할 수있는 작업이 달라집니다. 재부팅 (및 고정 커널로 업그레이드 또는 손상된 하드웨어 교체)하는 것이 좋습니다.


고양이는 응답하지 않습니다. 나는 이것이 버그라고 생각하지 않습니다. 나는 그것이 "기능"이라고 생각합니다.
올빼미

7

다른 답변은 이것이 좀비 프로세스라고 가정합니다. 좀비 프로세스는 실행이 완료된 프로세스이지만 부모가 종료 상태를 알고 자하는 경우 여전히 프로세스 테이블에 있습니다. 이것은 정상이며, init할당 된 좀비 프로세스를 자동으로 정리합니다.

좀비 프로세스는 아무것도 멈추지 않아야하므로 문제가되지 않을 것 같습니다. 시스템 호출 또는 드라이버 정지 인 경우 프로세스가 중단 불가능한 상태 일 수 있습니다. 여기에 좋은 설명이 있습니다 .


너무 많은 좀비 프로세스는 프로세스 테이블의 공간을 여전히 차지하기 때문에 fork성공 하지 못했을 수 있습니다 (하드 nrpoc에 도달 한 경우).
dhchdhd

2

Linux에서 좀비 프로세스를 찾으려면

$ ps axo 통계, ppid, pid, comm | grep -w 소멸

Z 555 10242 Damn-Zombie <소모 함>

먼저 kill 명령을 사용하여 SIGCHLD 신호를 좀비의 상위 프로세스로 보낼 수 있습니다. 위 명령은 각 좀비의 PPID (부모 프로세스의 PID)를 제공합니다. 이 예에서 좀비의 PPID는 555입니다.

$ sudo kill -s SIGCHLD 555

좀비 프로세스가 여전히 사라지지 않으면 좀비의 상위 프로세스 (예 : 555)를 종료 할 수 있습니다.

$ sudo kill -9 555

상위 프로세스가 종료되면 Linux의 모든 프로세스의 상위 프로세스 인 init 프로세스에서 좀비를 채택합니다. 초기화 프로세스는 주기적으로 wait()좀비 프로세스를 거두기 위해 호출 합니다.


이것이 실제 답변입니다. 부모님을 죽여서 고마워요
앤드류

1

부모를 죽이면 좀비 만 죽일 수 있습니다. 좀비 프로세스가 모든 리소스를 해제했으며 부모가 종료 상태를 가져 오기를 기다리고 있습니다. 부모가 wait자식에서 종료 상태를 가져 오기 위해 a 를 실행하지 않으면 좀비가됩니다 . 좀비의 부모를 죽이면 init종료 상태를 선택하고 좀비가 결국 죽습니다.


그래서 당신은 내가 init을 죽이고 싶어? 그것은 미안 hehe 질문에서 분명하지 않지만 부모는 초기화 된 것 같습니다 : (나는 질문을 편집했습니다.
Sam Stoelinga

4
아니요, 좀비를 죽이지 않기를 바랍니다. 좀비는 죽일 수 없습니다. 이 FAQ는 유닉스만큼 오래되었습니다.
tripleee

@tripleee : 그렇습니다. 내가 가진 것은 좀비가 아닐 수도 있습니다. htop이 작동하지 않고 cat / proc / $ pid / cmdline 또는 ls / proc / $ pid /도 작동하지 않습니다. 일반적으로 이것은 좀비에서는 발생하지 않으므로 여기서 묻는 이유는 일반적인 문제는 아닙니다. 나는 부모님을 죽이겠다고 말하는 몇 가지 답변을 확인했습니다.이 경우 초기화되거나 재부팅됩니다.
Sam Stoelinga

1
"부모를 죽이십시오"는 일반적인 좀비를 얻는 방법입니다. 당신은 죽일 수 없습니다 init. 에서 좀비가 보호되는 경우, 좀비를 init죽일 수 없습니다.
tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.