Prozessliste unter Linux über Python

Antworten:

128

IMO, das das /procDateisystem betrachtet, ist weniger böse als das Hacken der Textausgabe von ps.

import os
pids = [pid for pid in os.listdir('/proc') if pid.isdigit()]

for pid in pids:
    try:
        print open(os.path.join('/proc', pid, 'cmdline'), 'rb').read().split('\0')
    except IOError: # proc has already terminated
        continue
Bobince
quelle
10
Sie müssen den Aufruf von read () mit einem try / exception-Block umgeben, da eine vom Lesen von os.listdir ('/ proc') zurückgegebene PID zum Zeitpunkt des Lesens der cmdline möglicherweise nicht mehr vorhanden ist.
Yanamon
4
Zu guter Letzt! Validierung! Jetzt kann ich aufhören! :-)
Bobince
5
-1 für / proc, da es nicht portabel ist und bessere Schnittstellen verfügbar sind
Good Person
2
Achtung: Die Kommandozeile wird mit 0x00 beendet. Leerzeichen werden ebenfalls durch dasselbe Zeichen ersetzt.
Federico
2
Einfach verwenden psutil- dies alles geschieht über eine schöne Pythonic-Oberfläche und ist portabel, wenn Sie jemals auf einem Nicht-Linux-Server ausgeführt werden möchten.
RichVel
83

Sie könnten psutil als plattformunabhängige Lösung verwenden!

import psutil
psutil.pids()

[1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224,
268, 1215, 1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355,
2637, 2774, 3932, 4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245, 
4263, 4282, 4306, 4311, 4312, 4313, 4314, 4337, 4339, 4357, 4358, 
4363, 4383, 4395, 4408, 4433, 4443, 4445, 4446, 5167, 5234, 5235, 
5252, 5318, 5424, 5644, 6987, 7054, 7055, 7071]
Enthusiasten
quelle
2
Schauen Sie sich einfach die Dokumentation an .
Enthusiast
Vielen Dank, dass Sie dies angesprochen haben! Ordentliches Paket.
Codekoala
5
Es ist nicht vollständig plattformunabhängig - unter OSX können AccessDenied-Fehler auftreten: groups.google.com/forum/?fromgroups=#!topic/psutil/bsjpawhiWms
amos
@amos macht irgendwie Sinn - Sie möchten zuerst über Berechtigungen verfügen, bevor Sie Informationen zu Prozessen abrufen. Danke für den Tipp.
JSmyth
Um den OSX-Punkt zu erweitern, benötigen Sie im Gegensatz zu Linux Root-Berechtigungen unter OSX, um Prozessinformationen abzurufen.
RichVel
8

Sie können eine Drittanbieter-Bibliothek wie PSI verwenden :

PSI ist ein Python-Paket, das Echtzeitzugriff auf Prozesse und andere verschiedene Systeminformationen wie Architektur, Boottime und Dateisysteme bietet. Es verfügt über eine Python-API, die auf allen unterstützten Plattformen konsistent ist, bei Bedarf jedoch auch plattformspezifische Details bereitstellt.

ars
quelle
2
PSI wurde zuletzt im Jahr 2009 aktualisiert, während Psutil in diesem Monat (November 2015) aktualisiert wurde - Psutil scheint eine bessere Wahl zu sein.
RichVel
7

Die sanktionierte Methode zum Erstellen und Verwenden von untergeordneten Prozessen erfolgt über das Unterprozessmodul.

import subprocess
pl = subprocess.Popen(['ps', '-U', '0'], stdout=subprocess.PIPE).communicate()[0]
print pl

Der Befehl ist in eine Python-Liste von Argumenten unterteilt, sodass er nicht in einer Shell ausgeführt werden muss (Standardmäßig verwendet der Unterprozess.Popen keine Shell-Umgebung, in der er nur ausgeführt wird). Aus diesem Grund können wir Popen nicht einfach 'ps -U 0' liefern.

Matt
quelle
0

Ich würde das Unterprozessmodul verwenden , um den Befehl psmit den entsprechenden Optionen auszuführen . Durch Hinzufügen von Optionen können Sie ändern, welche Prozesse angezeigt werden. Viele Beispiele zum Unterprozess auf SO. Diese Frage beantwortet, wie zum psBeispiel die Ausgabe von analysiert wird :)

Wie in einer der gezeigten Beispielantworten angegeben, können Sie auch das PSI- Modul verwenden, um auf Systeminformationen zuzugreifen (z. B. die Prozesstabelle in diesem Beispiel ).

Extraneon
quelle
-2
import os
lst = os.popen('sudo netstat -tulpn').read()
lst = lst.split('\n')
for i in range(2,len(lst)):
    print(lst[i])
Manivannan Murugavel
quelle