규도자 개발 블로그
Python 프로세스 킬러 (Process killer) 본문
파이썬 프로세스 킬러
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()
이런 형태가 된다.
'Python > Python' 카테고리의 다른 글
파이썬의 유닛테스트를 한번에 파악할 수 있는 코드 (0) | 2022.05.17 |
---|---|
파이썬의 이스터에그 (0) | 2022.05.16 |
[Python] csv를 dict로 (1) | 2022.02.09 |
파이썬 스크립트 terminal에서 실행할 때 ModuleNotFoundError 해결하기 (0) | 2022.01.09 |
Python에서 setInterval함수 쓰기 (특정 시간마다 함수 반복하기) (0) | 2022.01.08 |
Comments