我有一个 Java 代码,它正在编写一个 Linux bash 脚本,然后执行 chmod 以添加执行权限,然后尝试执行它。我在进程开始时收到一个 IOException,说 error=26, Text file busy。 我已验证文件已完成写入并且流已关闭。 chmod 工作正常,但我不断收到此错误。

我注意到,如果我运行调试器并逐步执行代码,则不会出现错误,因此显然存在计时问题。在尝试执行 bash 脚本之前,如何确保 chmod 已完成?我想避免不可靠的解决方案,比如添加 Thread.sleep(10000),以及“hacky”的事情,比如将执行放在一个循环中的 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)。

最佳答案

您确定是 chmod 对随后的错误负责吗?在尝试运行输出文件之前,您能否检查一下 是否确实关闭了 输出文件?

如果您确实关闭了它,那么我不知道为什么 chmod 会导致该错误,但是您可以通过使用 shell 运行脚本来避免运行 chmod:
String[] cmd = {"bash", postfile };

关于java执行bash脚本,错误= 26文本文件忙,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6345660/

10-11 22:50
查看更多