问题标签 [processbuilder]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 如何在 Windows 上正确调用 JAVA 中的 CMD 文件?
我有如下示例 java 代码。
在 test.cmd 中实际上调用了另一个 java 应用程序。除非我将 $$ 标记的行更改为以下以重定向其输出,否则无法启动另一个 java 应用程序。
你们有什么想法吗?提前致谢。:)
java - 有没有更好的方法从进程的输入流中读取,然后使用指定的方法进行处理?
我正在编写一个执行以下工作的程序:
- 使用 ProcessBuilder 运行命令(如“svn info”或“svn diff”);
- 从进程的
getInputStream()
;读取命令的输出 - 使用命令的输出,我想要:
- 解析输出并得到我想要的并在以后使用它,或者:
- 将输出直接写入指定文件。
现在我正在做的是使用BufferedReader
逐行读取命令输出并将它们保存到一个ArrayList
,然后决定我是否只是扫描这些行以找出一些东西或将这些行写入文件。
显然这是一个丑陋的实现,因为如果我想将命令的输出保存到文件中,则不需要 ArrayList。那么你会建议什么,以更好的方式做到这一点?
这是我的一些代码:
使用它来运行命令并从进程的输出中读取
在一种方法中,我可能会这样做:
在另一个我可能会这样做:
java - ProcessBuilder.start() causes host JVM to exit
I'm developing a networked application where there is a Client and Server JVM, both of which are supposed to depend on set of identical jars, which may or may not be stored in the same location. Immediately after connecting to the Server, the Client compares the MD5 Sums of its jars against the jars on the server. If the MD5 Sums don't match, the Client downloads the Server's jars into a new folder and attempts to spawn a new Process
that doesn't depend on any of the jars the Client is currently using, then exits. This new Process
is then supposed to overwrite the Client's jars with the copies from the server that the Client saved to the new folder mentioned abve, then exits.
The problem is, whenever the Client attempts to launch the new process, the Client's JVM exits silently. Here's the code that spawns the new Process
:
The Client appears to be exiting at the call to pb.start()
. Here is my program's console output:
The print statement after pb.start()
never gets called. I've tested this both in Java 6 and Java 7, and I've also tried using Runtime.getRuntime().exec()
, to no avail. Has anyone seen anything like this before?
java - 如何为在 java 中启动的 nogui 进程创建控制台窗口?
当我在 Java 中启动一个没有 GUI 的进程时,没有打开控制台 ( cmd.exe
) 窗口。
例子:
如何查看控制台窗口?
java - java Process'inputStream卡住了
这是我的场景:
- 进程 A 产生子进程 B 并旋转线程以耗尽 B 的输出。
- 进程 B 生成守护进程 C 并排出其输出。
- 进程 B 完成,守护进程仍然存在。
- 进程 A 发现进程 B 通过 process.waitFor() 退出。但是,它一直在读取进程 B 的输入流。这是因为 B 已经启动了一个守护进程。输入流仅在进程 C 退出时接收 EOF。
这只发生在 Windows 上。我正在使用 ProcessBuilder。这是我想出的解决方案,我想听听您的反馈,因为没有我真正喜欢的解决方案:
- 我可以使用 jna 来生成守护进程 C。这样我可以创建一个“足够分离”的进程,并且进程 A 不会卡在从 B 中排出流。它有效,但我不太热衷于该解决方案,因为这意味着一些本机代码(还有很多,因为我热衷于使用输入)。一些如何通过 JNA 来实现的灵感在这里:http: //yajsw.sourceforge.net(但是它包含的东西不仅仅是进程启动)。
- 在 jre7 上运行。Jdk7 为 ProcessBuilder 带来了一些新的好处,例如,inheritIO() 也解决了我的问题。显然,当打开inheritIO() 时,我可以简单地关闭守护进程C 中的所有流(无论如何我都会这样做,因为它是一个守护进程),这就解决了问题。但是,我需要在 jre5+ 上运行
- 在生成守护进程 C之前关闭进程 B 中的 System.out 和 System.err 。同样,它解决了问题,但我确实需要这些流在进程 B 中工作,因为我向它们编写有用的东西。不好。我希望我可以通过在 B 和 C 之间放置某种引导过程来利用这个特性,但这并没有解决问题。
- 我在linux上没有这个问题,所以我只能在linux上运行吗?不,我不能。
- 使进程 A 以非阻塞方式排出进程 B 的输出。这有点工作,但它不方便。例如 inputStream.read() 是不可中断的。我可以使用 inputStream.available() 但它不区分 EOF 和零字节可用。因此,只有当进程 A 对 B 的输出 EOF 不感兴趣时,该解决方案才是好的。此外,这个解决方案似乎更占用 CPU 资源,而且通常......感觉很尴尬,而且不是真正的防弹。
- 在 --dry-run 模式下运行进程 C,它只是检查它是否可以启动。它尝试启动、发送欢迎消息并退出。它不再长时间运行,因此不会阻塞读取。进程 B 可以获得足以启动 C 的信心,并且我们可以使用相对简单的 JNA 代码来生成分离的进程而不消耗其输出(正是输出的消耗使 JNA 相关的代码变得混乱和重量级)。唯一的问题是我们不再使用进程的 C 输出,但可以通过让 C 写入进程 B 可以使用的众所周知的文件来解决。这个解决方案更像是一个大而丑陋的解决方法,但对我们来说是可行的。无论如何,我们目前正在尝试解决方案 1)。
我真的很感激任何提示!
java - 无法在 Java 中使用 ProcessBuilder 运行 exe 文件
我正在尝试运行一个 exe 文件,同时为它设置一些参数,如下所示:
当我从命令行运行它时,它可以完美运行。但是当我尝试从我的 Java 代码运行它时,进程会启动,但一段时间后不再响应,所以我必须强行关闭它。我正在使用这个 Java 代码:
任何想法我做错了什么?
java - 从 Java 启动守护进程
是否可以从java启动守护程序。具体来说,我正在尝试在 java 中使用 MongoDB,但是如果 mongod 守护程序尚未运行,我希望我的应用程序启动它。我似乎可以启动它,exitcode 为 0。但是它总是立即退出。是否可以强制它保持运行,然后使用 proc.destroy() 退出它?
ProcessBuilder pb = new ProcessBuilder("./bin/mongod","--dbpath data/db");
Process proc = pb.start();
如果我在启动进程后设置断点,hasExisted 布尔值始终为真,退出代码为 0,我无法连接。
这也是在 OS X 10.5 上,我知道 ProcessBuilder 在整个操作系统中都很挑剔
java - 以低优先级启动进程(使用 Runtime.exec / ProcessBuilder.start)
我需要以低优先级启动 CPU 密集型系统进程,以免降低我的服务器速度。我怎样才能在 Linux 上做到这一点?
这类似于这个问题:Start a Java process at low priority using Runtime.exec / ProcessBuilder.start? 除了在 Linux 而不是 Windows 上。如果在进程启动后改变进程的优先级是可以的(只要没有太多延迟)。
java - ProcessBuilder 调试
我创建了一个可执行 jar 并使用来自另一个 java 程序的进程生成器执行它。这是我的代码 -
}
我现在正在尝试从 Eclipse 调试 src.jar。我在调试配置中提供了项目 src 作为外部项目,但它仍然没有遇到我的任何断点。有没有办法为这样的东西设置调试环境?
java - ProcessBuilder的问题
以下代码在记事本中打开状态非常好:
以下代码不播放歌曲: