Da Sie sagten, dass dies ein Linux-Server ist, rufen Sie den externen ps auf Binary ist normalerweise langsamer, verbraucht mehr Ressourcen und ist fehleranfälliger als die Verwendung der Informationen aus /proc direkt.
Da sonst niemand erwähnt hat, gibt es einen einfachen Weg:
glob.glob('/proc/[0-9]*/')
Viel Glück.
Um Python-Unterprozesse zu starten/stoppen, können Sie das Unterprozessmodul verwenden. Um zu überprüfen, ob sie ausgeführt werden, können Sie psutil verwenden:
>>> import psutil
>>> pid = 1034 # some pid
>>> psutil.pid_exists(pid)
True
>>>
...oder dies (es wird auch prüfen, ob die PID wiederverwendet wurde):
>>> p = psutil.Process(pid)
>>> p.is_running()
True
>>>
Das ist, was ich benutze. Es verwendet procfs (Sie sind also auf Unix-ähnliche Systeme beschränkt, werden meiner Meinung nach nicht auf Macs funktionieren) und den zuvor erwähnten Glob. Es erhält auch die cmdline, mit der Sie den Prozess identifizieren können. Zum Beenden des Prozesses können Sie os.kill(signal.SIGTERM, pid)
verwenden . Für die Verwendung von Unterprozessen lesen Sie bitte diesen Beitrag Python, Popen und wählen Sie - Warten auf die Beendigung eines Prozesses oder eine Zeitüberschreitung
def list_processes():
"""
This function will return an iterator with the process pid/cmdline tuple
:return: pid, cmdline tuple via iterator
:rtype: iterator
>>> for procs in list_processes():
>>> print procs
('5593', '/usr/lib/mozilla/kmozillahelper')
('6353', 'pickup -l -t fifo -u')
('6640', 'kdeinit4: konsole [kdeinit]')
('6643', '/bin/bash')
('7451', '/usr/bin/python /usr/bin/ipython')
"""
for pid_path in glob.glob('/proc/[0-9]*/'):
# cmdline represents the command whith which the process was started
f = open("%s/cmdline" % pid_path)
pid = pid_path.split("/")[2] # get the PID
# we replace the \x00 to spaces to make a prettier output from kernel
cmdline = f.read().replace("\x00", " ").rstrip()
f.close()
yield (pid, cmdline)
Die Überprüfung der Liste der laufenden Prozesse erfolgt (selbst mit Kerndienstprogrammen wie "ps"), indem der Inhalt des /proc-Verzeichnisses betrachtet wird.
Daher ist die Bibliothek, die Sie zum Abfragen laufender Prozesse interessieren, die gleiche, die zum Arbeiten mit anderen Dateien und Verzeichnissen verwendet wird (z. B. sys
oder os
, je nach gewünschtem Geschmack. Achten Sie besonders auf os.path
obwohl es das meiste von dem tut, wonach Sie suchen). Um Prozesse zu beenden oder anderweitig mit ihnen zu interagieren, senden Sie ihnen Signale, was mit os.kill
erreicht wird . Schließlich starten Sie neue Prozesse mit os.popen
und Freunde.