ich benötige eine Funktion die abprüft ob ein script, oder besser, ob das Script selber schon läuft.
könnt ihr mir da helfen?
Gruß compi
Anmeldungsdatum: Beiträge: 49 |
ich benötige eine Funktion die abprüft ob ein script, oder besser, ob das Script selber schon läuft. könnt ihr mir da helfen? Gruß compi |
||||||
Anmeldungsdatum: Beiträge: 1816 |
Hallo, eine Möglichkeit ist hier beschrieben. Der dritte Bullet-Point der bestbewerteten Antwort drückt genau deinen Anwendungsfall aus. |
||||||
Anmeldungsdatum: Beiträge: 29240 Wohnort: Germany |
Du kannst das Script auch so starten lassen (oder darin so aufbereiten): pidof script || script Dann startet das Script nur, wenn es noch nicht läuft, eindeutiger Name vorausgesetzt. Alternativ kannst du auch eine Variable oder Datei anlegen lassen touch /tmp/script123-is-running , deren Existenz du überprüfst: if [ -f /tmp/script123-is-running ]; then scriptname oder_scriptinhalt-im-script-hier-als-block fi Am Ende des Scriptes natürlich wieder löschen lassen - spätestens beim Neustart wird /tmp sowieso automatisch geleert. |
||||||
Anmeldungsdatum: Beiträge: 364 |
Du möchtest also eine bool'sche Funktion schreiben, die prüft, ob sie selbst ausgeführt wird. Das ist doch sinnlos, weil sie nur true zurückliefern kann - sonst wäre sie ja gar nicht aufgerufen worden. |
||||||
Anmeldungsdatum: Beiträge: 29240 Wohnort: Germany |
Es geht wohl darum, Mehrfachstarts zu vermeiden, um mehrere Instanzen desselben Programms auf einmal zu vermeiden. |
||||||
Projektleitung
Anmeldungsdatum: Beiträge: 13176 |
Es geht darum zu erkennen, ob es bereits eine andere Instanz des Skriptes gibt. Das ist überhaupt nicht sinnlos. Ein übliches Verfahren, das bereits genannt wurde, ist eine Pid-Datei. Man kann auch sehr schön
|
||||||
Anmeldungsdatum: Beiträge: 364 |
|||||||
Anmeldungsdatum: Beiträge: 645 Wohnort: Freiburg |
Mein Skript selbsttest.sh:
|
||||||
Projektleitung
Anmeldungsdatum: Beiträge: 13176 |
Guter Ansatz! Aber wozu die Schleife im Hintergrund, die nichts tut und nie terminiert? (Du kannst die Schleifenbedingung Ich hätte das dann ja eher unabhängig vom Namen gemacht, weil man das sonst immer ändern muss, wenn sich der Skriptname ändert:
|
||||||
Anmeldungsdatum: Beiträge: 645 Wohnort: Freiburg |
Die Schleife war nur als Dummy-Main-Code gedacht. Das Skript musste ich ja irgendwie am Laufen halten, um zu testen, ob beim zweiten Aufruf die bereits laufende Instanz erkannt wird.
Danke für den Hinweis, Du hast recht, so ist das universeller einsetzbar. An Deiner Modifikation erkenne ich natürlich auch, dass es für den "Main Code" keines else-Abschnittes bedarf. Als Hobby-Coder bin ich ja immer froh, wenn ich dazu lernen kann! Grundsätzlich würde mich deshalb noch interessieren, welchen Vorteil die Lösungen mit PID-Datei oder flock haben – die im Gegensatz zu meinem Skript ja eine zusätzliche Datei erforderlich machen bzw. anlegen? |
||||||
Projektleitung
Anmeldungsdatum: Beiträge: 13176 |
Ja, aber dafür muss ja der Hauptcode nicht im Hintergrund laufen.
😬
Eine interessante Frage! Da muss ich einen Moment nachdenken. Die Lösung mit
Jetzt zu den Vorteilen der einzelnen Lösungen:
Ich glaube, ich würde
|
||||||
Anmeldungsdatum: Beiträge: 645 Wohnort: Freiburg |
Vielen Dank für Deine interessanten und sehr ergiebigen Ausführungen! Spätestens jetzt hat es mich wirklich gejuckt, Deine Lösungen selbst auszuprobieren und mit dem "exotischen" flock ein wenig zu experimentieren. In zwei Punkten kam ich dabei bzgl. flock doch zu einer vielleicht leicht kritischeren Einschätzung: 1. Folgende Aussage rklm schrieb:
fand ich leider nicht bestätigt. Nach einer Umbenennung wird doch von einer neuen Instanz die alte Lockdatei ignoriert und eine neue erzeugt! Dies ließe sich umgehen, indem man für die Lockdatei einen festen, also vom Skriptnamen unabhängigen Namen vorgibt. Deinen Ansatz
habe ich dafür wie folgt variiert:
(wobei ich ein ganze begriffsstutzige Weile brauchte, bis ich darauf kam, dass ich Deine Umleitung in der letzten Zeile umkehren konnte/musste ... 😉 ). Bei dieser Variante muss man allerdings aufpassen, dass man nicht versehentlich für verschiedene Skripte den gleichen Lockfilenamen vergibt. Aber natürlich ist die Umbennung eines laufenden Skripts, wie Du sagst, ein doch ziemlich theoretischer und deshalb wahrscheinlich vernachlässigbarer Fall. 2. Ein etwas schwerwiegenderer Einwand ist vielleicht folgender: Wird die Ausführung des obigen Skripts (egal ob in Deiner oder meiner Variante) durch einen kill-Befehl oder eine unvorhergesehene Panne beendet, kann es erst wieder gestartet werden, wenn man nicht vergisst, vorher die Lockdatei zu löschen. Nicht betroffen von diesem Problem ist jedoch Deine, wie ich finde, geniale Lösung, dass das Skript sich selbst "flockt". Deshalb: Mein absoluter Favorit!!! 👍 Nochmals herzlichen Dank für Dein "Privat-Tutorium", von dem aber vermutlich auch der Themenstarter (der sich nicht wieder/ noch nicht gemeldet hat) auf der Suche nach einer praxisgerechten Lösung profitieren kann! |
||||||
Projektleitung
Anmeldungsdatum: Beiträge: 13176 |
☺
Ich weiß nicht, was Du genau getestet hast - bei mir funktioniert es. Achso, Du hast wahrscheinlich den Namen der Lockdatei vom Namen des Skriptes abgeleitet. Meine Beschreibung oben bezog sich auf den Fall, dass das Skript selbst zum Locken benutzt wird oder man wenigstens den Namen der Lockdatei nicht ändert. Dieses steht in x.sh mit passenden Rechten für die Ausführung:
Auf der Konsole:
Wie Du siehst, gibt es nur eine Ausgabe "lauf", was dem Hauptprogramm entspricht.
Das ist falsch. Zum einen wird das Lock automatisch vom Kernel freigegeben, wenn der Prozess - auf welche Art auch immer - terminiert. Danach kann ein neuer Prozess das Lock wieder ziehen. Zum zweiten beruht der Ansatz mit
Du siehst zwei Ausgaben "lauf", was bedeutet, dass beide Prozesse auf unterschiedliche Locks gehen.
Ja, das scheint wirklich die eleganteste Lösung zu sein.
Bitte! Ich fand es auch interessant, da mal ein bisschen tiefer einzusteigen. Einen schönen Sonntag noch! robert |
||||||
Projektleitung
Anmeldungsdatum: Beiträge: 13176 |
PS: Ich habe gesehen, dass ich dazu ja bereits etwas auf meiner Benutzerseite hatte. ☺ Ich habe jetzt mal den Link zu diesem Thema eingefügt und werde den Rest ggf. auch noch mal ein wenig anpassen. |
||||||
![]() Anmeldungsdatum: Beiträge: 7782 |
flock ist natürlich genial. 👍 Für einfachste Ansprüche mache ich das jedoch mit mkdir... mkdir /tmp/mein-script-dings || exit echo Das hier läuft jetzt nur einmal. rmdir /tmp/mein-script-dings mkdir schlägt fehl wenn das Verzeichnis schon existiert, und die Existenz eines Verzeichnisses sollte auch mehr oder weniger atomar sein. Man muss nur drauf achten daß das Script nicht zwischendurch aussteigt, also das Verzeichnis am Ende wieder weg ist. Sonst ist es blockiert bis man manuell eingreift. Ansonsten lasse ich es auch einfach per screen laufen, dazu habe ich auch ein screen-manager Script in meinem GitHub, das verträgt zur Not auch interaktive Anwendungen die nur einmal laufen sollen. |