java выполняет сценарий bash, ошибка = 26 Текстовый файл занят

У меня есть java-код, который записывает сценарий Linux bash, затем выполняет chmod для добавления разрешения на выполнение, а затем пытается его выполнить. Я получаю исключение IOException во время запуска процесса: error = 26, Text file busy. Я убедился, что запись файла завершена и поток был закрыт. chmod работает нормально, но я продолжаю получать эту ошибку.

Я заметил, что если я запускаю отладчик и шаг через код, он не получает ошибку, поэтому очевидно, что есть проблема с синхронизацией. Как я могу убедиться, что chmod выполнен, прежде чем я попытаюсь выполнить сценарий bash? Я бы хотел избежать ненадежных решений, таких как добавление Thread.sleep (10000), и «хакерских» вещей, таких как помещение выполнения в блок try / catch внутри цикла, который пытается до тех пор, пока не завершится успешно.

У меня есть справедливая количество кода, обертывающего запуск процесса с прослушивающими потоками и т. д.,но вот упрощенная версия того, что он делает (попробовал этот код и получил тот же результат):

String[] cmd1 = {"/bin/chmod", "750", postFile };
new ProcessBuilder(cmd1).redirectErrorStream(true).start().waitFor();
String[] cmd2 = { postFile };
new ProcessBuilder(cmd2).redirectErrorStream(true).start().waitFor();

Каждый раз после выполнения "postFile" имеет правильные 750 разрешений, но не выполняется (из-за IOException).

5
задан Jared 14 June 2011 в 16:18
поделиться