다음은 여러 스레드에 걸쳐 있는 다음 새 프로세스를 생성하고 종료하는 Python 애플리케이션입니다.
$ cat restart.py
import os
import random
import signal
import sys
import threading
import time
class Name(object):
def __init__(self, name):
self.name = name
class CallThreads(threading.Thread):
def __init__(self, target, *args):
self.target = target
self.args = args
threading.Thread.__init__(self)
def run (self):
self.target(*self.args)
def main(args):
print("Hello, world!")
letter = random.choice(['A', 'B', 'C', 'D', 'E', 'F'])
count = 0
while count<3:
count += 1
name = Name(letter+str(count))
t = CallThreads(provider_query, name)
t.daemon = True
t.start()
time.sleep(3)
print("------------")
print("Time to die!")
t = CallThreads(restart)
t.daemon = True
t.start()
time.sleep(0.1)
sys.exit(0)
def provider_query(name):
while name.name!='':
print(name.name)
time.sleep(1)
def restart():
os.system('python restart.py')
def signal_handler(signal, frame):
sys.exit()
if __name__ == '__main__':
signal.signal(signal.SIGINT, signal_handler)
main(sys.argv)
을 클릭하면 bash 프롬프트가 표시되지만 ^C
출력은 계속 나타나고 프로세스 테이블에는 스크립트가 계속 표시됩니다.
$ ps aux | grep restart.py
1000 5751 0.0 0.0 4396 616 pts/3 S 08:41 0:00 sh -c python restart.py
1000 5752 0.3 0.1 253184 5724 pts/3 Sl 08:41 0:00 python restart.py
1000 5786 0.0 0.0 9388 936 pts/4 S+ 08:41 0:00 grep --color=auto restart.py
으로 죽이려고 했지만 kill 5751 && kill 5752
PID가 변경되기 전에(스크립트가 다시 시작될 때 새 프로세스에서) 충분히 빠르더라도 도움이 되지 않았습니다. 나는 그것을 시도했지만 pkill restart.py
그것도 도움이 되지 않았습니다. pkill python
종료하고 싶지 않은 다른 Python 프로세스가 실행 중이기 때문에 이것을 사용하는 데 주의가 필요합니다 . 스크립트가 실행 중인 Konsole 창을 닫아도 도움이 되지 않습니다!
스크립트를 어떻게 죽일 수 있나요?
답변1
나는 그것을 죽이는데 성공했다
pkill -f restart.py
매뉴얼 페이지에서:
-f The pattern is normally only matched against the process name.
When -f is set, the full command line is used.
답변2
이 두 명령을 빠르게 몇 번 실행해야만(위쪽 화살표 키를 두 번 누름) 종료할 수 있습니다.
$ kill -9 `ps aux | grep "sh -c python restart.py" | grep -v grep | awk '{print $2}'`
$ kill -9 `ps aux | grep "0 python restart.py" | grep -v grep | awk '{print $2}'`
정말 고통 스럽습니다!