Mój skrypt bash blokuje plik, gdy Java próbuje go odczytać

0

Mam skrypt bash w Linuksie (CentOS), który przekierowuje dane wyjściowe do pliku. Uruchamianie zajmuje kilka minut:

./myBashScript.sh >> file.csv

Mam aplikację Java, która próbuje czytać plik (tylko odczyt) do dalszego przetwarzania:

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

Te procesy są włączone Crontab. Działa dobrze, ale najwyraźniej za każdym razem, gdy skrypt bash przekierowuje wyjście do pliku, aplikacja Java nie może go odczytać. Dzienniki pokazują "File not found" wyjątek!

Czy plik jest zablokowany ?! Jak mogę rozwiązać problem?

Tina J
źródło

Odpowiedzi:

1

Spróbuj / złap i spróbuj ponownie ... Blokada istnieje z jakiegoś powodu. Jeśli plik jest nadal zapisywany, nie chcesz go czytać. Nawet jeśli możesz, będzie przynajmniej jeden przypadek, w którym twój kod Java uzna, że ​​przeczytał cały plik, gdy generowanie CSV jeszcze się nie zakończyło.

W rzeczywistości twój kod jest niebezpieczny, plik jest prawdopodobnie zamknięty między dwoma dołączonymi do niego poleceniami powłoki, więc kod Java może otwierać i blokować sam plik podczas działania skryptu powłoki.

Tak więc uruchom kod Java po całkowitym wygenerowaniu pliku lub jeśli kod Java ogląda plik, wygeneruj plik pod nazwą tymczasową, a następnie zmień nazwę na oczekiwaną nazwę po zakończeniu.

xenoid
źródło
Dokładnie. Teraz zmieniam mój Crontab na kilka minut później, mam nadzieję, że po zakończeniu basha uruchomi się aplikacja java. Zmiana nazwy to kolejna sztuczka, której użyję w przypadku, gdy nadal powoduje to problemy.
Tina J