comment puis-je obtenir la liste des processus en Python?
-
11-09-2019 - |
Question
Comment puis-je obtenir une liste de processus de tous les processus en cours d'exécution de Python, sous Unix, contenant le nom puis de la commande / processus et id processus, afin que je puisse filtrer et tuer les processus.
La solution
Sur Linux, la solution la plus simple est probablement d'utiliser la commande ps
externe:
>>> 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')]]
vous pouvez sur d'autres systèmes doivent changer les options pour ps
.
Pourtant, vous pouvez exécuter man
sur pgrep
et pkill
.
Autres conseils
Sur Linux, avec un Python convenablement récent qui comprend le module subprocess
:
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
Vous devrez peut-être modifier la commande ps légèrement selon vos besoins.
La solution portable juste en Python utilise psutil . Vous avez différentes API pour interagir avec 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()
... et si vous voulez "rechercher et tuer":
for p in psutil.process_iter():
if 'nginx' in p.name() or 'nginx' in ' '.join(p.cmdline()):
p.terminate()
p.wait()
Pourquoi Python?
Vous pouvez utiliser directement killall
sur le nom du processus.