Stack Exchange Network

Stack Exchange network consists of 175 Q&A communities including Stack Overflow, the largest, most trusted online community for developers to learn, share their knowledge, and build their careers.

Visit Stack Exchange
2 added 16 characters in body
source | link

$ 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

$ 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

$ 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

$ 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
1
source | link

How to kill a script which starts new processes?

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?