Prozess PID unter Linux prüfen/beenden/starten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DanielTheNew
User
Beiträge: 13
Registriert: Donnerstag 26. Oktober 2006, 14:37

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.
Benutzeravatar
Blattlaus
User
Beiträge: 55
Registriert: Donnerstag 24. August 2006, 08:55

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 )
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
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.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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...
BlackJack

Ich denke die Leben mit dem Restrisiko.

(1 / 2**16) oder 0.0015% Wahrscheinlichkeit ist ja auch gar nicht soo schlecht.
DanielTheNew
User
Beiträge: 13
Registriert: Donnerstag 26. Oktober 2006, 14:37

Danke für eure antwoten.

Es funktioniert nun recht gut.
Antworten