Runtime和ProcessBulider提供了不同的方式来启动程序,设置启动参数、环境变量和工作目录。但是这两种方法都会返回一个用于管理操作系统进程的Process对象,再调用Process.waitFor()来等待命令执行结束,获取执行结果。 然而这样简单的调用也是有坑的,有几个地方需要小心留意 ###1、命令拼接空格问题(推荐使用ProcessBuilder) #...
但是Process.waitFor()本身并不支持超时时间设置,一个方法是改用非阻塞的Process.exitValue()方法,然后轮询检查进程状态,这种方式比较消耗CPU,以至于轮询间隔也不能设置得太小,总归不是很完美。另外就是另起一个线程来调用程序,在主线程中发现超时的时候,直接调用process.destroy()终止进程。 还有就是在捕获程序输出的...
process.waitFor(); 复制代码 子进程等待输入:如果子进程需要从标准输入读取数据,并且你没有向其提供输入,那么子进程可能会一直等待输入。为了避免这个问题,你可以通过调用Process.getOutputStream()方法获得子进程的输入流,并写入所需的输入。 ProcessBuilderprocessBuilder=newProcessBuilder(command);processBuilder.redirectOu...
ProcessBuilder processBuilder=newProcessBuilder("ps");processBuilder.redirectErrorStream(true);Process process=processBuilder.start(); processBuilder.start() 会立刻返回,不会待ps进程结束。所以Process提供waitFor方法,调用后线程阻塞,直到ps命令结束。但有一个问题,当命令的输出很多内容时,waitFor方法会一直卡着不返回。
java的process,在执行命令时,出现waitfor返回1错误。根据java文档,是operation not permited。但绝大多数情况下,这是瞎扯。 真正原因是,你执行的命令(dos或linux下的命令),java的process执行时候,出错了。而错误本身是在这个命令的字符串上。 大致的原因如下 ...
Processresult=process.waitFor(); System.out.println("Processresult:"+result); } } ``` 在上面的示例中,我们使用`Runtime.getRuntime().exec()`方法创建了一个新的进程对象,并使用`process.waitFor()`方法等待该进程结束。当进程结束时,我们可以通过返回值获取进程的返回值,并将其打印出来。 总之,`process...
Processproc=runtime.exec(COMMAND2_SSH); proc.waitFor() //容易造成主线程的阻塞。 原因: 当执行exec()后,创建一个子线程,子线程和java虚拟机创建3个连接:标准输入,标准输出,错误输出;子线程向缓冲区中写数据,若java虚拟机没有及时的读取缓冲区中的数据,导致缓冲区满了,则主线程会阻塞。此时就会卡住。
2. 因为主进程需要等待脚本执行完成,然后对脚本返回值或输出进行处理,所以这里主进程调用Process.waitfor等待子进程完成。 3. 通过shell脚本可以看出:子进程执行过程就是不断的打印信息。主进程中可以通过Process.getInputStream和Process.getErrorStream获取并处理。
java process.waitfor返回1的原因及解决 "OS error code 1: Operation not permitted" "OS error code 2: No such file or directory" "OS error code 3: No such process" "OS error code 4: Interrupted system call" "OS error code 5: Input/output error" "OS error code 6: No such device or...
这将使应用程序停止并 waitFor 永远等待。一个简单的解决方法是将错误重定向到常规输出。 ProcessBuilder pb = new ProcessBuilder("tasklist"); pb.redirectErrorStream(true); Process process = pb.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String ...