The following is a Python application which spans a few threads, then spawns a new process of itself and exits:
$ 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)
When I hit
^C I do get a bash prompt, but the output still comes and I still see the script in the process table:
$ 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
I've tried killing it with
kill 5751 && kill 5752, but that doesn't help even if I'm fast enough to do so before the PID changes (on a new process when the script restarts). I've tried
pkill restart.py but that does not help either. I'm wary of using
pkill python as there are other Python processes running that I don't want to kill. Even closing the Konsole window in which the script is running does not help!
How can I kill the script?