How to terminate process from Python using pid?
linux, process, python, terminal
Solution
Using the awesome `psutil` library it's pretty simple:
p = psutil.Process(pid)
p.terminate() #or p.kill()
If you don't want to install a new library, you can use the `os` module:
import os
import signal
os.kill(pid, signal.SIGTERM) #or signal.SIGKILL
See also the `os.kill` documentation.
If you are interested in starting the command `python StripCore.py` if it is not running, and killing it otherwise, you can use `psutil` to do this reliably.
Something like:
import psutil
from subprocess import Popen
for process in psutil.process_iter():
if process.cmdline() == ['python', 'StripCore.py']:
print('Process found. Terminating it.')
process.terminate()
break
else:
print('Process not found: starting it.')
Popen(['python', 'StripCore.py'])
Sample run:
$python test_strip.py #test_strip.py contains the code above
Process not found: starting it.
$python test_strip.py
Process found. Terminating it.
$python test_strip.py
Process not found: starting it.
$killall python
$python test_strip.py
Process not found: starting it.
$python test_strip.py
Process found. Terminating it.
$python test_strip.py
Process not found: starting it.
Note: In previous `psutil` versions `cmdline` was an attribute instead of a method.
Problem
I'm trying to write some short script in python which would start another python code in subprocess if is not already started else terminate terminal & app (Linux). So it looks like: ``` #!/usr/bin/python from subprocess import Popen text_file = open(".proc", "rb") dat = text_file.read() text_file.close() def do(dat): text_file = open(".proc", "w") p = None if dat == "x" : p = Popen('python StripCore.py', shell=True) text_file.write( str( p.pid ) ) else : text_file.write( "x" ) p = # Assign process by pid / pid from int( dat ) p.terminate() text_file.close() do( dat ) ``` Have problem of lacking knowledge to name proces by pid which app reads from file ".proc". The other problem is that interpreter says that string named dat is not equal to "x" ??? What I've missed ?