pid2data.py - An PID Name auslesen

Code-Stücke können hier veröffentlicht werden.
Antworten
BasterTWO
User
Beiträge: 75
Registriert: Donnerstag 25. Oktober 2007, 20:03

Hallo,
da ich oft hier schon gelesen habe wie man den Namen eines Prozesses nur an der PID auslesen kann habe ich mal eine kleine Funktion geschrieben.

pid2data.py

Code: Alles auswählen

#!/usr/bin/python2.5
# -*- coding: utf-8 -*-
import os
import sys

def pid2data(pid):
    """\
    Diese Funktion kann Daten von Prozessen ausgeben nur mit der PID
    """
    statusfile = "/proc/" + pid + "/status"
    if os.path.exists(statusfile) == "False":
        return False
    statusfile = file(statusfile, 'rU')
    data = {}
    for line in statusfile:
        line_lower = line.lower()
        if line_lower.startswith("name:"):
            data["name"] = line[len("Name:"):].strip()
        elif line_lower.startswith("pid:"):
            data["pid"] = line[len("pid:"):].strip()
    statusfile.close()
    return data

def main():
    pid = 1234    # Hier muss natürlich die richtige PID
    data = pid2data(pid)
    print data['name']
    print data['pid']

if __name__ == '__main__':
    main()
Ich hoffe die paar Zeilen können jemanden Helfen.

Viele Grüße
BasterTWO
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Anstelle von

Code: Alles auswählen

statusfile = "/proc/" + pid + "/status"
solltest du die Funktion "os.path.join" verwenden.

Die Zeile

Code: Alles auswählen

if os.path.exists(statusfile) == "False":
geht ja mal gar nicht ;-) Du meinst statt dem String "False" sicherlich nur False. Noch einfacher geht es mit "not":

Code: Alles auswählen

if not os.path.exists(statusfile):
Außerdem ist False als Rückgabewert etwas schlecht gewählt. An dieser Stelle würde sich eine Exception anbieten, oder None.

Eine Datei öffnent man typischerweise nicht mit "file" sondern mit "open". Außerdem könnte beim Öffnen eine IO-Exception geworfen werden. Wenn du diese abfängst, kannst du auch das Testen, ob die die Datei existiert, überspringen

Für "name" und "pid" könnte man ebenfalls noch Konstanten einführen. Damit könnte man dann auch das if/elif-Konstrukt vereinfachen.

Edit: Das

Code: Alles auswählen

"/proc/" + pid
wird natürlich nicht funktionieren, da "pid" ein Integer ist.
Antworten