새 프로세스를 시작하는 스크립트를 종료하는 방법은 무엇입니까?

새 프로세스를 시작하는 스크립트를 종료하는 방법은 무엇입니까?

다음은 여러 스레드에 걸쳐 있는 다음 새 프로세스를 생성하고 종료하는 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 5752PID가 변경되기 전에(스크립트가 다시 시작될 때 새 프로세스에서) 충분히 빠르더라도 도움이 되지 않았습니다. 나는 그것을 시도했지만 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}'`

정말 고통 스럽습니다!

관련 정보