Was ich tun möchte, ist, ein Verzeichnis (nicht rekursiv, nur eines) auf neu erstellte Dateien zu überwachen und diese Dateien während des Schreibens an eine einzelne große Datei anzuhängen.
Die Anzahl der Dateien, die geschrieben werden, ist riesig und kann bis zu 50.000 erreichen.
Mit benutze inotifywait
ich das Verzeichnis wie folgt:
inotifywait -m -e create ~/folder | awk '($2=="CREATE"){print $3}' > ~/output.file
Ich speichere also Namen neuer Dateien, die in erstellt wurden, ~/output.file
und verwende dann eine for-Schleife
for FILE in `cat ~/output.file`
do
cat $FILE >> ~/test.out
done
Es funktioniert einwandfrei, wenn die Geschwindigkeit, mit der eine Datei geschrieben (erstellt) ~/folder
wird, 1 Datei pro Sekunde entspricht.
Die Anforderungen sind jedoch groß und die Rate, mit der die Dateien erstellt werden, ist sehr hoch, beispielsweise 500 Dateien pro Minute (oder sogar mehr).
Ich habe die Anzahl der Dateien ~/folder
nach Abschluss des Vorgangs überprüft , aber sie stimmen nicht mit der inotifywait
Ausgabe überein . Es gibt einen Unterschied von etwa 10 bis 15 Dateien, variiert.
Auch die Schleife
for FILE in `cat ~/output.file`
do
done
verarbeitet nicht alle Dateien, ~/output.file
während sie geschrieben werden.
Kann mir bitte jemand eine elegante Lösung für dieses Problem vorschlagen?
quelle
inotifywait
unbestimmte Zeit ausgeführt, sodass ich den Prozess manuell beenden muss. Gibt es eine Möglichkeit, dies elegant zu tun? Die--timeout
Option wartet nur auf das erste Ereignis und wird dann beendet. Vielen Dank!monitor
undtimeout
zusammen mit der aktuellen Version müssen Sie diegit
Version installieren . Antwort aktualisiert.Eine Möglichkeit besteht darin, ein kleines Programm zu erstellen, mit dem die verarbeiteten Dateien nach der Verarbeitung aus dem Verzeichnis in ein anderes verschoben werden. Starten Sie einfach den Scan des Verzeichnisses neu, nachdem Sie fertig sind. Ruhen Sie vor dem erneuten Scannen eine angemessene Zeit lang, wenn keine Dateien vorhanden sind, und tun Sie dies für die Dauer der Dateierzeugung (der Vorgang zum Generieren der Dateien scheint nur bis zu 100 Minuten oder so zu laufen).
Wenn Sie die Dateien nicht aus dem Verzeichnis verschieben können, besteht ein anderer Ansatz darin, irgendwo in der Vergangenheit mit einem Datums- / Zeitstempel-DTS zu beginnen. Suchen Sie dann alle Dateien, die neuer als DTS sind, verarbeiten Sie sie und aktualisieren Sie DTS, wenn der Zeitstempel der Datei neuer als DTS ist. Wiederholen Sie diesen Vorgang wie bei der obigen Lösung. Wenn die Granularität Ihrer Zeitstempel verhindert, dass zwei Dateien dieselbe haben, können Sie einfach nach Dateien suchen, die neuer als DTS sind. Wenn nicht, müssen Sie nach Dateien suchen, die nicht älter als DTS sind, und eine Liste der Dateien mit dem DTS führen, die Sie beim nächsten Lauf verwenden möchten, und diese beim nächsten Lauf herausfiltern.
quelle