how do I get the process list in Python?
-
11-09-2019 - |
Question
How do I get a process list of all running processes from Python, on Unix, containing then name of the command/process and process id, so I can filter and kill processes.
Solution
On linux, the easiest solution is probably to use the external ps
command:
>>> import os
>>> data = [(int(p), c) for p, c in [x.rstrip('\n').split(' ', 1) \
... for x in os.popen('ps h -eo pid:1,command')]]
On other systems you might have to change the options to ps
.
Still, you might want to run man
on pgrep
and pkill
.
OTHER TIPS
On Linux, with a suitably recent Python which includes the subprocess
module:
from subprocess import Popen, PIPE
process = Popen(['ps', '-eo' ,'pid,args'], stdout=PIPE, stderr=PIPE)
stdout, notused = process.communicate()
for line in stdout.splitlines():
pid, cmdline = line.split(' ', 1)
#Do whatever filtering and processing is needed
You may need to tweak the ps command slightly depending on your exact needs.
The right portable solution in Python is using psutil. You have different APIs to interact with PIDs:
>>> import psutil
>>> psutil.pids()
[1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, ..., 32498]
>>> psutil.pid_exists(32498)
True
>>> p = psutil.Process(32498)
>>> p.name()
'python'
>>> p.cmdline()
['python', 'script.py']
>>> p.terminate()
>>> p.wait()
...and if you want to "search and kill":
for p in psutil.process_iter():
if 'nginx' in p.name() or 'nginx' in ' '.join(p.cmdline()):
p.terminate()
p.wait()
Why Python?
You can directly use killall
on the process name.