Verwenden lsof
path/to/input_gate
Fü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. lsof
Fü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.