2012-09-04 16 views
13

Gibt es eine einfache Lösung (mithilfe von Shell Utils, über ein Util von den meisten Distributionen oder ein einfaches Python/... -Skript), um einen Prozess neu zu starten, wenn sich einige Dateien ändern?Neustart bei Dateiänderung unter Linux

Es wäre nett, einfach wie watch -cmd "./the_process -arg" deps/* anrufen.

Update: Ein einfacher Shell-Skript zusammen mit den vorgeschlagenen inotify-Tool meiner Bedürfnisse passen (funktioniert für Befehle w/o Argumente) (schön!):

#!/bin/sh 
while true; do 
    [email protected] & 
    PID=$! 
    inotifywait $1 
    kill $PID 
done 
+0

Kann jemand erklären, was das "$!" Mach bitte (Konnte es nicht mit Google finden), Danke. – Lior

+1

Es gibt die ID des zuvor gestarteten Prozesses zurück. – Christian

+1

Wenn ein Dateisystem das 'noatime' Attribut nicht hat, dann wird Ziel Skript/Prozess in einer Endlosschleife wegen des' access' Ereignisses neu gestartet. Um das zu beheben, verwenden Sie stattdessen 'inotifywait -e modify $ 1', was nur auf Dateiänderungsereignisse reagiert. – chronos

Antwort

11

Ja, Sie können eine Uhr Verzeichnis über die inotify System mit inotifywait oder inotifywatch von der inotify-tools.

inotifywait wird beendet, wenn ein Ereignis erkannt wird. Übergeben Sie die Option -r, um Verzeichnisse rekursiv zu überwachen. Beispiel: inotifywait -r mydirectory.

Sie können auch das Ereignis angeben, nach dem gesucht werden soll, anstatt alle Ereignisse zu beobachten. Um nur auf Datei- oder Verzeichnisinhaltsänderungen zu warten, verwenden Sie die Option -e modify.

+0

Können Sie ein Beispiel geben? – Jon

+1

@Jon Ich habe ein Beispiel für "inotifywait" hinzugefügt, das für diese Aufgabe besser geeignet zu sein scheint als "inotifywatch". – scai

7

Check out iWatch:

Uhr ist ein Echtzeit-Dateisystem-Überwachungsprogramm. Es ist ein Werkzeug, um Änderungen im Dateisystem zu erkennen und sofort zu melden. Es verwendet eine einfache Konfigurationsdatei im XML-Format und basiert auf inotify, einem Dateiänderungs-Benachrichtigungssystem im Linux-Kernel.

als könnten Sie Dateien einfach sehen:

iwatch /path/to/file -c 'run_you_script.sh' 
+0

Vielleicht ist das sogar die bessere Antwort, aber ich bevorzuge die DIY-Lösung mit den Inotify-Tools. – Christian

5

Dies ist eine Verbesserung gegenüber der Antwort in der Frage zur Verfügung gestellt. Wenn einer das Skript unterbricht, sollte der Ausführungsprozess beendet werden.

#!/bin/sh 

sigint_handler() 
{ 
    kill $PID 
    exit 
} 

trap sigint_handler SIGINT 

while true; do 
    [email protected] & 
    PID=$! 
    inotifywait -e modify -e move -e create -e delete -e attrib -r `pwd` 
    kill $PID 
done 
+1

Danke! Beachten Sie, dass Sie '-e attrib' hinzufügen müssen, wenn Sie' somefile' berühren möchten, um einen Neustart auszulösen. – seanf