규도자 개발 블로그

Python 프로세스 킬러 (Process killer) 본문

Python/Python

Python 프로세스 킬러 (Process killer)

규도자 (gyudoza) 2022. 2. 15. 00:20

파이썬 프로세스 킬러

import os

def kill_process(process_name):
    process_read = os.popen(f"ps -ef | grep {process_name} | grep -v 'grep'").readlines()
    terminate_result = None
    for process in process_read:
        process_id = process.split()[1]
        terminate_result = os.popen(f"kill {process_id}")
    return terminate_result

프로세스단위에서 프로세스를 죽이는 스크립트이다.

 

내가 개인적인 용도로 사용했을 땐 내가 돌리고 있는 퀀트프로그램에서 웹소켓이 깨졌을 때 해당 프로세스를 전부 종료하고 다시 시작하기 위해서 사용했다. 왜인고 하면 거래소의 거래량이 폭증하면 웹소켓부터 끊어지곤 하는데 from websockets.exceptions import ConnectionClosedError로 예외처리를 하더라도 동시에 여러개의 웹소켓과 연결된 상태라면 한 개의 웹소켓만 꺼지고 다른 건 돌아가고 있으므로 프로세스 자체는 계속 유지됐다. 하지만 그래선 돌아가고 있는 의미가 없으므로 해당 프로세스를 전부 죽이는 용도로 사용하였다.

 

한가지 간단한 예제를 작성해보자면

from time import sleep

count = 10
while True:
    sleep(1)
    count -= 1
    print(count)
    if count == 0:
        exit()
        

이런 함수가 있으면 count가 0이 되는 순간 꺼지지만 여기에 process killer를 껴놓으면 0이 되기 전에 프로세스 그 자체를 종료시킬 수 있다.

 

# process_killer.py
import os
from time import sleep


def kill_process(process_name):
    process_read = os.popen(f"ps -ef | grep {process_name} | grep -v 'grep'").readlines()
    terminate_result = None
    for process in process_read:
        process_id = process.split()[1]
        terminate_result = os.popen(f"kill {process_id}")
    return terminate_result


count = 10
while True:
    sleep(1)
    count -= 1
    print(count)
    if count == 3:
        kill_process("process_killer")
    if count == 0:
        exit()

위 스크립트를 실행해보면 함수가 어떻게 작동되는지 정확히 파악할 수 있다. process_name에 원하는 프로세스 이름을 인자로 넘겨주면 해당 프로세스를 완전히 kill할 수 있다. 뭐 당연한 얘기겠지만 권한문제도 고려해야 한다. 만약에 특정 스크립트를 실행하는 그 파이썬 내부에서 적용시키려면 간단하게 __file__.split('/')[-1]를 통해서 현재 스크립트가 돌아가고 있는 파일의 이름을 가져올 수 있으니 이렇게 처리해도 된다. 예제에 적용해보면

# process_killer.py
import os
from time import sleep


def kill_process(process_name):
    process_read = os.popen(f"ps -ef | grep {process_name} | grep -v 'grep'").readlines()
    terminate_result = None
    for process in process_read:
        process_id = process.split()[1]
        terminate_result = os.popen(f"kill {process_id}")
    return terminate_result


count = 10
while True:
    sleep(1)
    count -= 1
    print(count)
    if count == 3:
        kill_process(__file__.split('/')[-1])
    if count == 0:
        exit()

이런 형태가 된다.

 

Comments