Мой скрипт bash блокирует файл, когда Java пытается его прочитать

335
Tina J

У меня есть скрипт bash в Linux (CentOS), который перенаправляет вывод в файл. Запуск занимает несколько минут:

./myBashScript.sh >> file.csv 

У меня есть Java-приложение, которое пытается прочитать файл (только чтение) для дальнейшей обработки:

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

Эти процессы включены Crontab. Все работает нормально, но, очевидно, всякий раз, когда скрипт bash перенаправляет вывод в файл, приложение Java не может его прочитать. В журналах показано "File not found"исключение!

Файл заблокирован ?! Как я могу решить проблему?

0

1 ответ на вопрос

1
xenoid

Попробуйте / поймайте и повторите ... Блокировка существует по причине. Если файл все еще пишется, вы не хотите его читать. Даже если это возможно, будет хотя бы один случай, когда ваш Java-код считает, что он прочитал весь файл, когда генерация CSV еще не завершена.

На самом деле ваш код опасен, файл, скорее всего, закрыт между двумя командами оболочки, которые к нему добавляются, поэтому ваш код Java может открывать и блокировать файл для себя во время выполнения сценария оболочки.

Итак, либо запустите код Java после того, как файл полностью сгенерирован, либо, если код Java наблюдает за файлом, сгенерируйте файл под временным именем, а затем переименуйте его в ожидаемое имя, как только это будет сделано.

Именно так. Теперь я изменяю свой Crontab на несколько минут спустя, надеюсь, после того, как bash будет завершен, будет запущено Java-приложение. И переименование это еще один прием, который я буду использовать в случае, если это все еще вызывает проблемы. Tina J 6 лет назад 0

Похожие вопросы