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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top