Ich möchte eine Datei jedes Mal ausführen, wenn sich eine Datei ändert

599
Jaffar

Ich habe ein Python-Skript, das nach X-Anzahl von Durchläufen automatisch endet. Beim Start des Programms wird der Wert von restart.txt mit diesem Code auf 0 gesetzt.

restart = open("restart.txt", "w") restart.write("0") restart.close() 

Am Ende des Programms wird die Datei dann auf 1 zurückgesetzt, sodass sie wie folgt neu gestartet werden kann inotify.

restart = open("restart.txt", "w") restart.write("1") restart.close() exit //closes program 

Ich möchte ein inotifySkript oder ähnliches, das, wenn sich der Wert von restart.txt auf 1 ändert, um das Programm erneut zu öffnen, einen Neustart.

Wie würde ich das mit einem inotifySkript oder ähnlichem machen?

2
Ich habe es vielleicht falsch verstanden, aber es scheint, als wollten Sie Ihr Skript sofort neu starten, nachdem es ausgeführt wurde. Wenn dies der Fall ist, können Sie das Skript so ändern, dass es sich wiederholt, oder es ist ein Wrapper um das Ganze herum. Warum interessieren Sie sich für "inotify"? bertieb vor 8 Jahren 0
@bertieb Der Zweck meines Skripts ist eine bestimmte Aktion, die sich 19 mal schließt. Ich möchte, dass es vom Skript aus neu gestartet wird, aber eine der verwendeten Bibliotheken unterstützt dies nicht. Meine alternative Lösung ist, eine externe Datei zu ändern und inotify zu verwenden, um bei Änderungen neu zu starten. Jaffar vor 8 Jahren 0
Welche Bibliothek, aus Gründen der Vollständigkeit (und Neugier)? In jedem Fall können Sie einen Wrap durchführen, indem Sie zB `while true; mach python myscript.py; done` wiederholt das Python-Skript endlos aufrufen? Es kann einen guten Grund geben, "inotify" zu verwenden, was ich hier nicht sehe, aber ich bin ein Fan davon, die Dinge einfach zu halten! bertieb vor 8 Jahren 0
_Skype4Py_ und _cleverbot_ nach einem Minimum von 19 Zeilen bis 30, werden Anzeigen in die Skype-Konversation gespuckt. Wenn ich sie neu starte, kann sie niemals eine Anzeige spucken. Das Skript verwendet für jeden Zweck eine Funktion (Lesen und Beantworten von Nachrichten), sodass es nicht wie empfohlen in einer Schleife ausgeführt werden kann. Jaffar vor 8 Jahren 0
Okay, fair genug. Ich kann nicht verstehen, warum es nicht in einer bash `while'-Schleife ausgeführt werden kann - es läuft, macht Sachen,` exit`ing und startet erneut. Warum unterscheidet sich der Start über ein "inotify-Skript" vom Starten einer neuen Instanz über "python myscript.py"? Es könnte sich lohnen, mehr Kontext in Ihre Frage aufzunehmen, um zu erklären, warum dies keine Möglichkeit ist. aber ich akzeptiere, dass mir etwas offensichtlich fehlt! bertieb vor 8 Jahren 0
Inotify ist nur eine Option. Ich bin neu in Linux und fühle mich außerhalb der grundlegenden Aufgaben wie dem Starten eines Skripts nicht sehr wohl. Ich wäre offen für andere Methoden. Jaffar vor 8 Jahren 0
Gut genug - für das, was Sie geschrieben haben ("Start A; A macht Sachen; Exit; Start A ..."), würde ich sagen, dass "Inotify" übertrieben ist. Wenn die Situation anders ist (z. B. Signalisieren zum Neustart von 'A' von einem anderen Programm 'B'), kann es * nützlich sein *, dies über 'inotify' zu tun, aber wie Sie TMTOWTDI sagen! bertieb vor 8 Jahren 0
Sicher, wie würde ich ein Bash-Skript erstellen, um es in einer Schleife auszuführen? Jaffar vor 8 Jahren 0
Wie in meinem Kommentar oben: create file (etwas nützliches wie `doskype.sh` genannt) mit dem Inhalt` `true '; Python machen; done`, ersetzt ``mit dem eigentlichen Skript. Machen Sie es ausführbar (`chmod + x doskype.sh`), und führen Sie es über`. / Doskype.sh` aus. Im Linux Documentation Project gibt es übrigens eine [Anleitung für Anfänger] (http://www.tldp.org/LDP/Bash-Beginners-Guide/html/). bertieb vor 8 Jahren 0

1 Antwort auf die Frage

1
MariusMatutiae

Der folgende Code-Ausschnitt kann in ein ausführbares Bash-Skript eingefügt werden:

 FORMAT=$(echo -e "\033[1;33m%w%f\033[0m written") while /usr/bin/inotifywait -qe close_write --format "$FORMAT" restart.txt do [ $(cat restart.txt) -eq 1] && /path/to/program/to/be/executed || echo "nothing to do" done 

Der Aufruf von inotifywait überwacht die Datei restart.txt im q uiet-Modus (dh, eine Ausgabe wird unterdrückt) auf ein Ereignis ( -e ), das die Datei schließt, nachdem sie zum Schreiben geöffnet wurde . Allerdings inotifywait kann nicht unterscheiden, ob die Datei wirklich geschrieben wurde, so dass die folgende Zeile implementiert einen Test: Wenn restart.txt enthält 1, dann eine Datei ausführen, aber wenn noch enthält 0dann nichts tun.