분류 기타

Linux에서 좀비 프로세스를 종료하는 방법

컨텐츠 정보

  • 조회 346 (작성일 )

본문

좀비 프로세스를 종료하려면 프로세스 목록에서 해당 이름을 제거해야 합니다.


시대만큼 오래된 이야기가 있습니다. C와 Unix, 그리고 (나중에) Linux가 있기 때문에 좀비가 생겼습니다.

특히 좀비 프로세스로 표시되는 프로세스가 있습니다. 어떤 사람들은 오해하고, 다른 사람들은 무시하며, 많은 성공 없이 이러한 프로세스를 종료하려는 우리 중 많은 사람들의 노력에 영향을 받지 않습니다. 왜 그런 겁니까?


Linux에서 프로세스란 무엇입니까? 


모든 것은 Linux의 프로그램이 실행될 때 시작되며 실행될 때 실행 중인 인스턴스를 프로세스라고 합니다. ps 명령어를 사용하여 Linux 환경의 모든 프로세스를 볼 수 있습니다.


ps -ax
        PID TTY         STAT   TIME COMMAND
        1 ?     Ss      0:01 /usr/lib/systemd/systemd rhgb --switched-root --sys
        2 ?     S       0:00 [kthreadd]
        3 ?     I<      0:00 [rcu_gp]
        4 ?     I<      0:00 [rcu_par_gp] 


때로는 프로세스가 다른 프로세스를 시작하여 첫 번째 프로세스를 두 번째 프로세스의 상위 프로세스로 만듭니다. pstree 명령은 시스템에서 프로세스의 '계보'를 볼 수 있는 훌륭한 도구입니다.


pstree -psn
systemd(1)─┬─systemd-journal(952)
        ├─systemd-udevd(963)
        ├─systemd-oomd(1137)
        ├─systemd-resolve(1138)
        ├─systemd-userdbd(1139)─┬─systemd-userwor(12707)
        │                     ├─systemd-userwor(12714)
        │                     └─systemd-userwor(12715)
        ├─auditd(1140)───{auditd}(1141)
        ├─dbus-broker-lau(1164)───dbus-broker(1165)
        ├─avahi-daemon(1166)───avahi-daemon(1196)
        ├─bluetoothd(1167) 


모든 프로세스에는 시스템에서 번호가 할당됩니다. 프로세스 ID 번호 1은 부팅 프로세스 중에 실행되는 맨 처음 프로세스에 할당되고 PID 1 이후의 모든 후속 프로세스는 그 후손입니다. PID 1 프로세스는 대부분의 최신 Linux 버전에서 시스템 프로그램에 대한 심볼릭 링크인 init입니다.


kill 명령으로 프로세스 종료 


kill 명령어를 사용하여 Linux 시스템에서 프로세스를 종료할 수 있습니다. 이름에도 불구하고 kill 명령어와 pkill 및 killall과 같은 다른 세트는 하나 이상의 프로세스에 SIGNALS를 보내도록 작성/설계되었습니다. 지정하지 않으면 전송하는 기본 SIGNAL은 프로세스를 종료하기 위한 SIGTERM 신호입니다.


상위 프로세스가 죽거나 종료되고 하위 프로세스가 상위 프로세스를 따르지 않는 경우 해당 프로세스를 고아 프로세스라고 합니다.


좀비 프로세스를 죽이는 방법 


반면에 좀비 프로세스는 죽일 수 없습니다! 왜 물어볼 수 있나요? 글쎄, 그들은 이미 죽었기 때문에!


모든 자식 프로세스가 종료되면 좀비 프로세스가 된 다음 부모에 의해 제거됩니다. 프로세스가 존재를 종료하고 사용했던 리소스를 해제할 때 해당 이름은 여전히 ​​OS 프로세스 테이블에 있습니다. 그런 다음 프로세스 테이블에서 이름을 제거하는 것은 상위 프로세스 작업입니다. 그것이 실패하면 우리는 더 이상 실제로는 프로세스가 아니라 OS의 프로세스 테이블에 있는 항목일 뿐인 좀비 프로세스를 갖게 됩니다.


이것이 종료할 것이 없기 때문에 존재하지 않는(좀비) 프로세스에서 -9(SIGKILL) 옵션을 사용해도 kill 명령을 수행하려고 하면 작동하지 않는 이유입니다.


따라서 프로세스 목록(프로세스 테이블)에서 이름을 제거하는 것처럼 좀비 프로세스를 종료하려면 부모를 종료해야 합니다. 예를 들어, PID 5878이 좀비 프로세스이고 부모가 PID 4809이면 좀비(5878)를 죽이려면 부모(4809)를 종료합니다.


sudo kill -9 4809  #4809 is the parent, not the zombie 


좀비에 대한 나의 마지막 경고. 부모 프로세스를 종료할 때는 매우 주의하십시오. 프로세스의 부모가 PID 1이고 이를 죽이면 스스로 재부팅됩니다!


그리고 그것은 더 무서운 이야기가 될 것입니다!


출처 : https://opensource.com/article/21/10/linux-zombie-process