2011-06-14 36 views
3

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

我注意到,如果我运行一个调试器,并通过代码一步,它没有得到错误,所以很明显有一个时间问题。在我尝试执行bash脚本之前,如何确保chmod已完成?我想避免像加入Thread.sleep(10000)这样的非可靠解决方案,以及将try/catch块中的执行放入尝试直到成功的循环内的“hacky”。

我的代码包装过程的启动与听线程等公正的量,但这里是它是做什么的简化版本(尝试这种代码也和它有相同的结果):

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)。

+1

我们可以有一些代码吗?就像你执行你的chmod的方式一样?谢谢 – talnicolas 2011-06-14 15:09:40

+0

仔细检查您没有在多个位置打开文件。 – 2011-06-14 16:34:49

+0

谢谢你。我有同样的问题,并有一个完全无关的,并处理了打开文件,但没有关闭它的类。 – AdamOutler 2013-02-17 21:19:15

回答

4

您确定它是chmod负责后续错误吗?在你尝试运行它之前,你能检查一下你是否确定输入文件关闭

如果关闭它,然后我不知所措,为什么文件模式应该会导致错误,但你可以避开需要运行使用你的shell中运行该脚本文件模式:

String[] cmd = {"bash", postfile };

+0

我试过了你的建议“String [] cmd2 = {”/ bin/sh“,”-c“,postFile},我得到同样的错误,我回去检查一下流再次关闭。 – Jared 2011-06-14 16:13:10

+0

你是对的,我用来解压文件的类没有关闭它,Doh! – Jared 2011-06-14 16:19:49

0

我不知道它是否相关,但通常你需要获取或重定向ErrorStream和InputStream(我通常在我创建的ResponseStreamReader中获取它们,不知道重定向选项)。

+0

我有代码来做到这一点,并有一个单独的线程正在监听。我只发布了一个简化版本的代码,因为我有一整个专门的课程。仅供参考,为了简单起见,我将错误重定向到输出流。 – Jared 2011-06-14 15:40:06

2

对于未来的参考,它可能已经引起了这个特定的情况下,未封闭的流,但设置上紧跟运行该文件file权限也导致此错误:

java.io.IOException: Cannot run program "...": error=26, Text file busy 

这是一个probable bug in JDK。在我的情况下,它是由这段代码造成的

Files.setPosixFilePermissions(Paths.get(scriptPath), set(PosixFilePermission.OWNER_EXECUTE, PosixFilePermission.OWNER_READ)); 
ProcessBuilder processBuilder = new ProcessBuilder(scriptPath).directory(workingDir); 
processBuilder.start(); 

即使没有编辑脚本文件。