Tag: processbuilder

ProcessBuilder:转发已启动的进程的stdout和stderr,而不阻塞主线程

我正在使用ProcessBuilderbuild立一个Javastream程,如下所示: ProcessBuilder pb = new ProcessBuilder() .command("somecommand", "arg1", "arg2") .redirectErrorStream(true); Process p = pb.start(); InputStream stdOut = p.getInputStream(); 现在我的问题如下:我想捕获进程的stdout和/或stderr,并将其redirect到System.outasynchronous。 我希望进程及其输出redirect在后台运行。 到目前为止,我发现要做到这一点的唯一方法是手动产生一个新的线程,它将不断从stdOut读取,然后调用System.out的相应write()方法。 new Thread(new Runnable(){ public void run(){ byte[] buffer = new byte[8192]; int len = -1; while((len = stdOut.read(buffer)) > 0){ System.out.write(buffer, 0, len); } } }).start(); 虽然这种方法的作品,感觉有点肮脏。 最重要的是,它给了我更多的线程来正确pipe理和终止。 有没有更好的方法来做到这一点?

如何用ProcessBuilder设置工作目录

我正在尝试在Ubuntu的主目录中启动一个进程。 我得到一个数组越界的exception。 这里是代码: Process p = null; ProcessBuilder pb = new ProcessBuilder(); pb.directory(new File("/home")); p = pb.start(); 这是一个例外: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at java.lang.ProcessBuilder.start(ProcessBuilder.java:459) at tester.Main.main(Main.java:31) Java Result: 1

Java ProcessBuilder:结果进程挂起

我一直在尝试使用Java的ProcessBuilder在Linux中启动应该“长期”运行的应用程序。 这个程序运行的方式是启动一个命令(在这种情况下,我启动一个媒体播放应用程序),让它运行,并检查,以确保它没有崩溃。 例如,检查PID是否仍然有效,然后重新启动进程,如果它已经死了。 我现在得到的问题是,PID在系统中保持活动状态,但应用程序的GUI挂起。 我尝试将ProcessBuilder(cmd).start()转换为一个单独的线程,但似乎没有解决任何问题,正如我所希望的那样。 基本上,对于用户来说,程序APPEARS已经崩溃,但是杀死驱动ProcessBuilder.start()进程的Java进程实际上允许创build的进程恢复其正常行为。 这意味着Java应用程序中的某些内容正在干扰生成的进程,但我完全不知道在这一点上是什么。 (因此,为什么我试图把它分成另一个线程,这似乎没有解决任何问题) 如果有人有任何意见或build议,请让我知道,因为我不能为了我的生活而想到如何解决这个问题。 编辑:我不关心从stream程创build的I / Ostream,因此没有采取任何措施来处理 – 这可能会导致stream程本身的挂起?

如何获得进程的PID我刚刚开始在Java程序内?

我已经用下面的代码开始了一个过程 ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "path"); try { Process p = pb.start(); } catch (IOException ex) {} 现在我需要知道我刚刚开始的进程的PID。

ProcessBuilder和Runtime.exec()之间的区别

我试图从java代码执行一个外部命令,但是我注意到了Runtime.getRuntime().exec(…)和new Process(…).start()之间的区别。 使用Runtime : Process p = Runtime.getRuntime().exec(installation_path + uninstall_path + uninstall_command + uninstall_arguments); p.waitFor(); exitValue为0,命令终止。 但是,使用ProcessBuilder : Process p = (new ProcessBuilder(installation_path + uninstall_path + uninstall_command, uninstall_arguments)).start(); p.waitFor(); 退出值是1001,命令终止在中间,虽然waitFor返回。 我该怎么办才能解决ProcessBuilder的问题?