Mein Bash-Skript sperrt die Datei, wenn Java versucht, sie zu lesen

389
Tina J

Ich habe ein bash-Skript in Linux (CentOS), das die Ausgabe in eine Datei umleitet. Die Ausführung dauert einige Minuten:

./myBashScript.sh >> file.csv 

Ich habe eine Java-Anwendung, die versucht, die Datei zur weiteren Verarbeitung zu lesen (nur lesen):

 File file = new File("file.csv"); Scanner input = new Scanner(file); while (input.hasNextLine()) { String line = input.nextLine(); // do something... } 

Diese Prozesse laufen ab Crontab. Es funktioniert gut, aber wenn das Bash-Skript die Ausgabe an die Datei umleitet, kann die Java-App sie nicht lesen. Die Protokolle zeigen eine "File not found"Ausnahme!

Ist die Datei gesperrt ?! Wie kann ich das Problem beheben?

0

1 Antwort auf die Frage

1
xenoid

Try / catch und erneut versuchen ... Die Sperre existiert aus einem bestimmten Grund. Wenn die Datei noch geschrieben wird, möchten Sie sie nicht lesen. Selbst wenn Sie können, gibt es mindestens einen Fall, in dem Ihr Java-Code der Meinung ist, dass er die gesamte Datei gelesen hat, wenn die CSV-Generierung noch nicht abgeschlossen ist.

Tatsächlich ist Ihr Code gefährlich. Die Datei wird wahrscheinlich zwischen zwei Shellbefehlen, die an ihn angehängt werden, geschlossen, sodass der Java-Code die Datei öffnen und für sich selbst sperren kann, während das Shell-Skript ausgeführt wird.

Starten Sie also entweder den Java-Code, sobald die Datei vollständig generiert wurde, oder generieren Sie die Datei unter einem temporären Namen, wenn der Java-Code die Datei überwacht, und benennen Sie ihn anschließend in den erwarteten Namen um.

Genau. Ich ändere jetzt meinen Crontab auf ein paar Minuten später, hoffentlich wird die Java-App ausgeführt, sobald die Bash beendet ist. Umbenennen ist ein weiterer Trick, den ich verwenden werde, falls dies immer noch Probleme verursacht. Tina J vor 5 Jahren 0