Seite 1 von 1

Prozess PID unter Linux prüfen/beenden/starten

Verfasst: Donnerstag 9. November 2006, 17:47
von DanielTheNew
Hallo

Hab hier mit der suche schon einige Beiträge zum Thema "Prozess" gefunden aber so ganz das was ich suche war nicht dabei.

1. Im Prinzip will ich ein Programm starten und dessen PID nach /var/log/Programmname.pid schreiben. ( Ich denke dazu hab ich was gefunden )

2. Ich will anhand von /var/log/Programmname.pid prüfen ob das Programm und seine subprocesse noch läuft.

3. Will ich anhand der PID das Programm bebenden. ( dürfte mit kill -9 PID gehen )

Das ganze für LINUX!!

Bleibt also die große frage wie man zuferlässig anhand einer PID mit Python prüfen kann ob eine Programm noch läuft.
Ich denke mal das es sicher für diese Aufgab ein bereits fertiges modul gibt. Leider konnt ich es weder mit der Boardsuche noch bei google finden. ( suche ich falsch? )


Danke im voraus für eure Hilfe.

Verfasst: Donnerstag 9. November 2006, 21:51
von Blattlaus
1.) Du meinst vermutlich nicht /var/log/, sondern /var/lock. Ersteres ist ein Verzeichnis für Logfiles und außerdem nur von root schreibar, zweiteres ist für Lock-Files, also das was du willst ;)

2.) Wenn du die PID hast, kannst du einfach ein "ps h -p PID | wc -l" machen und wenn das ergebnis ungleich 0 ist, dann läuft das Programm.
Kleine erklärung dazu:
"ps -p PID" zeigt dir einfos zu der PID, die Option "h" unterdrückt eine Überschrift von ps und "wc-l" zählt die Zeilen.

3.) Ja, das geht mit kill. Allerdings sollte man nie kill -9 verwenden, es sei denn, das Programm hängt. Damit sendest du nämlich "KILL" an den Prozess und er beendet sich sofort und ohne irgendeine Chance zu haben noch irgendwas abschließendes durchzuführen (Dateien schließen, einstellungen speichern, usw.). Benutzt besser ein normales "kill PID", dann bekommt der Prozess die aufforderung sich zu beenden und fährt sich kontrolliert runter.


(* Ahja, zum Thema zuverlässig: Sowohl ps als auch wc gehören zur absoluten Standardaussstattung von jeder Distri und sind dementsprechend überall verfügbar...sogar im Resue und Singeluser modus )

Verfasst: Donnerstag 9. November 2006, 22:18
von Rebecca
Zu jedem laufenden Prozess gibt es in /proc ein Verzeichnis mit der entprechenden Prozess-ID. Du must also nur os.listdir("/proc") nach der Prozess-ID durchsuchen. (Nichts anderes machen Tools wie ps). Da gibt es leider nichts fertiges fuer in Python. Aber immerhin es gibt os.kill.

Verfasst: Donnerstag 9. November 2006, 22:43
von BlackJack
Wobei das immer noch die Unsicherheit birgt, dass das Programm längst nicht mehr läuft, dafür aber ein anderes, welches die gleiche PID zugewiesen bekommen hat.

Verfasst: Donnerstag 9. November 2006, 23:05
von Rebecca
Mmh. Auch wieder wahr. Man koennte noch ein paar zusaetzliche Sicherheitsmechanismen einfuehren: Zum Beispiel pruefen, ob die Kommandozeile die erwartete ist (/proc/nnnn/task/nnnn/cmdline). Ausserdem koennte man dafuer sorgen, dass das Programm, welches die lock-Datei anlegt, diese auch wieder loescht. Wenn man es geschickt anstellt (signalhandler, Exceptions abfangen etc.), sollte man dann nicht alle Faelle zum Beenden eines Programms ausser sigkill erwischen koennen? D.h. man wuerde sich das Suchen nach einer PID in einigen Faellen ersparen. Ausserdem dauert es natuerlich ein Weilchen, bis die Nummerierung der PIDs wieder von vorne beginnt.

Dieses Verfahren, die PID in einer Datei zu speichern fuer spaetere Verwendung sieht man doch oefter. Haben die da noch andere Tricks, oder leben die mit dem (kleinen) Restrisiko?

Edit: Zeit fuers Bett. Ich habe Muehe, meine eigenen Gedankengaenge nachzuvollziehen...

Verfasst: Donnerstag 9. November 2006, 23:42
von BlackJack
Ich denke die Leben mit dem Restrisiko.

(1 / 2**16) oder 0.0015% Wahrscheinlichkeit ist ja auch gar nicht soo schlecht.

Verfasst: Sonntag 12. November 2006, 01:28
von DanielTheNew
Danke für eure antwoten.

Es funktioniert nun recht gut.