[TIL] Python Popen 프로세스와 좀비프로세스

햄스터아저씨·2022년 5월 29일
0

Python 으로 프로세스를 생성하고 종료하는 중, 좀비가 남는 이슈가 발생해, 그것을 해결한 내용
https://stackoverflow.com/questions/2760652/how-to-kill-or-avoid-zombie-processes-with-subprocess-module

좀비가 남는 코드

subprocess 로 생성하고 psutilProcess.kill() 을 이용해 프로세스 종료한 예시

import psutil
import subprocess

def run():
    subprocess.Popen(["python", "test.py"])


def kill_process(process_name):
    for proc in psutil.process_iter():
        if process_name in proc.cmdline():
            proc.kill()

run()
kill_process('test.py')

이 경우 ps로 확인해보면 좀비가 남아있게 된다. (Z+)

좀비 프로세스는 실행결과를 부모 프로세스가 받지 않아서, 죽은 프로세스가 return 을 받을때까지 결과가 남아있는 것이다

따라서 부모 프로세스가 그 결과를 받아주면 소멸한다.


좀비가 없는 코드

import subprocess
import time

running_status = {
    "my_program": None
}

def run():
    running_status['my_program'] = subprocess.Popen(["python", "test.py"])


def kill_popen(process_name):
    # 좀비 프로세스를 제거하기 위해, popen 객체를 통해 return 값을 받습니다.
    s = running_status[process_name]
    s.terminate()
    time.sleep(0.5)
    s.poll()
    
run()
kill_popen('my_program')
profile
서버도 하고 웹도 하고 시스템이나 인프라나 네트워크나 그냥 다 함.

0개의 댓글