Prüfen, ob ein anderes Python Script schon läuft

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
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Gibt es ein simpler Code, um herauszufinden ob ein Python Script schon läuft, möchte nämlich das in ein anderes Python Script einpflegen.
Wenn das Python Script xxx läuft, dann soll es irgendetwas machen. So in etwa stell ich mir das vor,.
Gibt es da ein Modul?
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

So was in der Richtung kann man zwar machen, klingt aber wie du es beschreibt eher seltsam. Beschreib' mal, was du eigentlich vorhast; die Chancen stehen nicht so schlecht, dass es eine bessere Lösung gibt.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ich möchte es in einen Python Script einbauen. Das Script soll wenn es läuft gestoppt werden. Aber das geht nur, wenn die Bedingung heißt:
"läuft das Script, dann führe das aus..."
So in etwa, deswegen dachte ich, es gibt ein code welches prüft ob ein Script läuft, dann den Rückgabewert für "if" benutzen.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist nicht wirklich eine Beschreibung deines Problems, sondern eine Umschreibung der Lösung, von der du denkst das sie passt. Aber zu 99.999% ist es das nicht, wenn es sich um zwei Python Skripte handelt.

Was machen die Skripte, und warum soll das eine nicht laufen, wenn das andere läuft?
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ich möchte mit einen (enigma2) Plugin, was ich aufrufe, einen Script starten. Und wenn ich es wieder aufrufe, möchte ich es angezeigt bekommen, ob ich es beenden möchte. Das kann ich aber nur wenn ich ein Rückgabewert erhalte, ob es läuft.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da ich dieses enigma2 nicht kenne, und du ja nicht wirklich nicht ausholst um das zu erläutern: ein Weg dieses Problem anzugehen ist ein file lock. Damit stellt das OS sicher, dass nur ein Prozess gleichzeitig eine Datei offen hält. Und wenn du in deinem gestarteten Skript eine Datei wie zb /var/run/meinskript.pid anlegst & lockst, und darin wiederum die Prozessid des Skripts selbst speicherst, kannst du ganz einfach von außen feststellen, ob da Programm noch läuft, und es killen. Alternativ schreibst du eine Systemd-Unit, und startest/stoppst die.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ich könnte ja beim start dieses Scriptes eine Zahl (z.b. die 1) in eine Datei schreiben lassen, und wenn in der Datei die Zahl "1" vorhanden ist, läuft das Script und kann beendet werden, und beim beenden wird der Dateiinhalt wieder gelöscht. Das wäre theoretisch machbar. Was sagen die Experten zu der Idee?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@egon11: das ist doch genau das, was __deets__ vorschlägt, nur dass man die ProzessID statt der 1 in die Datei schreibt, um auch zu prüfen, ob das Skript wirklich noch läuft, und nicht nur das Programm abgestürzt ist und deshalb niemand die Datei gelöscht hat.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nicht nur die ID. Sondern auch noch ein file lock setzt. Dadurch verhindert man, die nicht eindeutig vergebenen Prozess-IDs zu verwechseln.

Ich habe mich gerade erinnert - das habe ich mal als fertiges Modul gebaut: https://github.com/AbletonAG/abl.util/b ... ockfile.py
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ich hab mal nach Python filelock geschaut, aber so richtig keine gute Dokumentation gefunden, wie man es einbaut. auch von __deets__ habe ich mir angeschaut. Ich habe ein linux Rechner.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1020
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Wenn du dir den Code ansiehst, wirst du erkennen, dass es auch unter Linux und Windows laufen wird.

Code: Alles auswählen

...

if platform.system() in ('Windows', 'Microsoft'):
    is_windows = True

if is_windows:
    import msvcrt
else:
    import fcntl
...
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

ok. Meine frage wäre noch, wie ich es in ein Script einbaue. Mir ist leider nicht ganz klar (hab auch schon filelock pypi durchgelesen) was ich damit machen soll.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist ein Modul. Das kannst du importieren (wenn du es runtergelaufen hast, es sollte sich sogar mit pip installieren lassen, dann als ‚pip install abl.util‘).

Und dann macht man so was der Art wie es im Test dafür zu sehen ist:

https://github.com/AbletonAG/abl.util/b ... ockfile.py
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was in den Beispielen leider fehlt: du kannst dem Kontextmanager natürlich das dateiobjekt auf die übliche Art entlocken:

with LockFile(....) as f:
....

Das eignet sich dann um PID zu schreiben oder zu lesen.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Jetzt habe ich es glaube verstsnden, mit dem file locker sperre ich eine datei, wenn ich mit einen anderen script auf die datei zugreifen möchte, dann geht es nicht, und wenn, dann läuft das script nicht mehr.
Jetzt muss ich mir praktisch den code zusammen bauen...
Antworten