Das Erkennen einer GZip-Datei wird noch während des Kopierens geschrieben

3

Ich erhalte eine gzip-Datei in einem Pfad.

Eingabeordnerpfad:

<server>/input_gate

Ich möchte überprüfen, ob die GZIP-Datei, die ich in diesem Ordner erhalte, gültig ist. Ich habe den folgenden Befehl verwendet. Es funktioniert gut, eine gültige gzip-Datei zu finden oder nicht?

gzip -t -v <file_name>

Beim Verschieben wird die Datei jedoch als ungültige Datei angezeigt. Tatsächlich ist die Datei jedoch nach dem Verschieben gültig. Gibt es eine Möglichkeit herauszufinden, ob die Datei, die ich erhalte, eine vollständig verschobene Datei ist oder noch verschoben wird?

Raj
quelle

Antworten:

0

Gemäß dieser Antwort auf "Ask Ubuntu" können Sie lsof(Liste geöffneter Dateien) verwenden, um zu überprüfen, ob die Datei geöffnet ist:

lsof | grep <server>/input_gate
JakeGould
quelle
Jake, danke für deine Antwort. Ich hoffe, das klappt bei mir. Gibt es sowieso zu simulieren, denn der Umzug geht schneller.
Raj
@ Raj Bin froh geholfen zu haben! Das Erstellen einer Simulation liegt außerhalb des Bereichs dieser Frage. Experimentieren Sie selbst und probieren Sie verschiedene Ideen aus; man wird arbeiten.
JakeGould
0

Verwenden lsof

path/to/input_gateFühren Sie den folgenden Befehl aus, um zu testen, ob in einem Prozess eine Datei geöffnet ist :

lsof path/to/input_gate

Dies wird mit Code 0 beendet, wenn die Datei von einem Prozess verwendet wird, und mit Code 1, wenn sie von keiner Verarbeitung verwendet wird (oder ein Fehler aufgetreten ist). Dieser Exit-Code kann von Shell-Befehlen verwendet werden.

Testen

Um dies zu testen, erstellen wir einen Prozess zum Öffnen unserer Datei:

sleep 10 >>path/to/input_gate &

Dadurch bleibt die Datei 10 Sekunden lang geöffnet. lsofFühren Sie zum Testen schnell den folgenden Befehl aus:

$ if lsof path/to/input_gate >/dev/null; then echo "In use"; else echo "Not in use"; fi
In use

Warten Sie 10 Sekunden und versuchen Sie es erneut:

$ if lsof path/to/input_gate >/dev/null; then echo "In use"; else echo "Not in use"; fi
Not in use

Warten bis die Datei fertig ist

Wenn Sie warten möchten, bis kein anderer Prozess die Datei verwendet:

while lsof path/to/input_gate >/dev/null; do sleep 1; done; echo "Finally, not in use"

Verwenden inotifywait

Wenn Ihr System dies unterstützt inotifywait(ein Linux-System sollte dies tun), können Sie in der Datei nach Ereignissen suchen, die für Sie von Interesse sind:

inotifywait  "path/to/input_gate" -e close

Der obige Befehl wird blockiert, bis ein Prozess die Datei geschlossen hat.

Der Vorteil dieses Ansatzes besteht darin, dass keine Abfragen durchgeführt werden müssen.

Der Nachteil dieses Ansatzes ist, dass Sie beim ersten Mal benachrichtigt werden, dass ein Prozess die Datei schließt und dies möglicherweise nicht mit allen Prozessen übereinstimmt, die die Datei geschlossen haben.

John1024
quelle