2016-07-18 13 views
1

Ich habe eine schwere Zeit zu verstehen, eine Art von Anomalie mit Grep Rückgabewert.grep verhält sich merkwürdig in Kombination mit inotifywait

Wie in der grep man-Seite erwähnt, ist der Rückgabewert im Falle einer Übereinstimmung Null und im Falle von Nicht-Übereinstimmung/Fehler/etc nicht Null.

In diesem Code: (bash)

inotifywait -m ./logdir -e create -e moved_to | 
    while read path action file; do 
    if grep -a -q "String to match" "$path/$file"; then 
     # do something 
    fi 
    done 

Es gibt nicht-Null, wenn abgestimmt.

In diesem Code: (bash)

search_file() 
{ 
    if grep -a -q "String to match" "$1"; then 
    # do something 
    fi 
} 

inotifywait -m ./logdir -e create -e moved_to | 
    while read path action file; do 
     search_file "$path/$file" 
    done 

Es gibt Null zurück, wenn abgestimmt.

Kann mir jemand erklären, was vor sich geht?

EDIT: Lassen Sie mich noch einmal klar zu sagen: wenn ich den ersten Code auf einer Datei ausgeführt, die die Zeichenfolge enthält, die if-Anweisung ausgeführt wird. Wenn ich den zweiten Code für dieselbe Datei ausfühle, schlägt die if-Anweisung fehl und wird nicht ausgeführt.

+3

_ "es gibt nicht Null zurück, wenn es übereinstimmt" _ Nein, tut es nicht. Etwas anderes passiert. Eine Möglichkeit besteht darin, dass, während Sie auf das Ereignis 'create' warten, aber nicht' close_write', die Datei geschrieben wird, wenn der 'grep'-Test ausgeführt wird. – John1024

+1

Woher weißt du, was es zurückgibt? Willst du damit sagen, dass im letzteren Fall nur der Körper der "if" -Anweisung ausgeführt wird? –

+0

@ John1024 - nichts geht weiter. keine Fehler (ich überprüfte auch ohne -q) – Nlandau

Antwort

2

Ich unterstütze @John1024 's Vermutung, dass er als comment schrieb.

Die "Anomalie" ist wahrscheinlich auf einen leichten Zeitunterschied zwischen den beiden Versionen Ihres Skripts zurückzuführen. Im Fall eines create Ereignisses ist die Datei anfangs leer, so dass grep mit dem Scannen einer teilweise geschriebenen Datei beginnt. Der Aufruf von grep über eine Funktion führt zu einer kleinen Verzögerung, die die Wahrscheinlichkeit erhöht, dass die gesuchten Daten in der Datei erscheinen, wenn die Datei grep geöffnet wird.

Die Lösung dieses Race-Bedingung hängt von ein paar Annahmen/Anforderungen:

  • Können Sie davon ausgehen, dass bereits bestehende Dateien im überwachten Verzeichnis nicht geändert werden?

  • Möchten Sie jede neue passende Datei so schnell wie möglich identifizieren, oder können Sie es sich leisten, die Verarbeitung zu verzögern, bis sie geschlossen wird?

+0

Endlich funktioniert es. Wie @ John1024 vorgeschlagen hat, löste ein kleiner Schlaf nach dem Ereignis von Inotify das Problem.Ich muss es so machen, weil ich nicht auf close_write warten kann (es wird ständig geschrieben) und das create-Ereignis ist zu bald. Danke für die Hilfe! – Nlandau

Verwandte Themen