问题标签 [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.

0 投票
4 回答
29524 浏览

java - Process Builder waitFor() 问题和打开文件限制

我继承了一些代码:

基本上,将键/值对作为文件存储在磁盘上是有一些古老且高度基于巫术的原因。我真的不想进入它。

但是,我留下了一堆 IO 异常:

一堆我的意思是在 10k - 数百万的领域

我觉得 waitFor 调用是为了阻止这些发生,等待进程完成并退出,但是我认为 chmod 在文件实际关闭之前返回结果。有谁知道这是否会导致这些异常?

我的另一个倾向是,在 java 端打开和关闭数千个文件的速度不够快,而且还有其他事情发生,可能是某种形式的文件缓冲区没有被清除fw.close() 被调用。

我对java很陌生,这是一个让我难过的怪异。(很高兴该应用程序仍然以某种方式运行..在吐出一个非常大的日志文件之后)

任何人都可以想出一种方法来解决这个问题,清除缓冲区或将文件打开限制增加到 jvm 可以跟上自己的东西(假设这是问题所在)

0 投票
2 回答
6522 浏览

java - 使用线程和 ProcessBuilder

我真的不熟悉使用线程,所以我希望有人能帮助我找出最好的方法来做到这一点。

我的 java 应用程序中有一个 JButton...当您单击该按钮时,我有一个 Process Builder,它创建一个执行一些外部 python 代码的进程。python 代码会生成一些文件,这可能需要一些时间。当 python 代码执行完毕后,我需要将这些文件加载​​到我的 Java 应用程序中的一个小程序中。

在当前的形式中,我在调用外部 python 文件的代码中有一个 p.waitFor() ......所以当你点击按钮时,按钮会挂起(整个应用程序实际上挂起),直到进程完成。显然,我希望用户能够在此过程进行时与应用程序的其余部分进行交互,但是一旦完成,我希望我的应用程序知道它,以便它可以将文件加载到小程序中.

做这个的最好方式是什么?

谢谢你的帮助。

0 投票
2 回答
2490 浏览

java - 使用 ProcessBuilder 在 Jar 中运行可执行文件

我有一个我构建的应用程序,它使用它通过 ProcessBuilder 调用的非 Java 可执行文件:

ProcessBuilder pb = new ProcessBuilder(invocation);
pb.redirectErrorStream(true);
Process proc = pb.start();
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

但是,我想将该应用程序整齐地捆绑到 jar 文件本身中,而不是要求将其放在同一目录之外。有没有办法在不解压的情况下运行这个应用程序?

如果我需要删除 ProcessBuilder,那很好,只要它有效。:)

0 投票
4 回答
5833 浏览

java - 跨 Java 进程共享对象

我正在从主应用程序执行另一个 JVM (java.exe)。有没有办法与新创建的进程(在创建时或创建后)共享对象(相当大的对象)。

现在我希望 proc 对象表示的进程可以使用 sO 对象

ProcessBuilder 是否为此提供任何实用程序?

0 投票
3 回答
3948 浏览

java - Java ProcessBuilder:外部进程挂起

我正在使用 Java 的 ProcessBuilder 类来运行外部进程。进程不应在 Java 程序终止之前终止;它必须在命令/响应模式下保持活跃。

我知道如果忽略进程流很容易“堵塞”,所以我做了以下事情:程序在“读取器”线程中读取进程的组合输出和错误流,并使用“写入器”线程来管理命令. 读取器线程从进程输出中读取阻塞字符,将它们缓冲到字符串中并分派结果。编写器线程通过 PrintWriter 编写完整的“命令”行;它使用队列来确保没有两个命令写入“靠得太近”(当前为 100 毫秒),并且在前一个命令的输出完成之前不会写入新命令。在每次 println() 之后,我也会调用 flush() 和 checkError()。

该方案可以正常工作几秒钟或几分钟,然后读取器线程挂起阻塞 read()。没有错误,没有抛出异常,没有更多的流程输出。此后,没有什么可以恢复外部进程(除了重新启动它)。(顺便说一句,这发生在 Linux 和 Windows 上。)

我已经查看了 Jakarta Commons Exec 和 Plexus Utils http://plexus.codehaus.org/plexus-utils/中的代码和测试用例,但是(a)都没有给出使用长期进程的示例和( b)似乎两者都没有做任何与我所描述的基本不同的事情。

请问有人知道这里发生了什么吗?谢谢!

0 投票
4 回答
3126 浏览

java - Java ProcessBuilder显示已启动Java应用程序的控制台?

我有一个 JAVA 应用程序,它启动(使用 ProcessBuilder)另一个 JAVA 应用程序,如下所示:

现在,这工作正常,appName 使用参数 val 启动,它运行并工作......很好......问题是没有控制台窗口出现...... appName 做了很多输出到控制台,我们需要看到它...如何使用控制台启动该过程?

我正在尝试(“CMD.exe”,“java”,“-classpath”,dir,appName,val)等东西......但我做错了......

另外,我不能重定向流,我的程序实际上可以启动 5-10 个这些 appName,每个都应该有自己的控制台窗口来显示自己的信息。

任何帮助将非常感激。谢谢,

0 投票
2 回答
1830 浏览

jvm - 从 JVM 运行 bash 脚本

我无法从 Java 运行一个简单的 bash 脚本。具体来说:

...

... 其中 'command' 是所有人都可以执行的 bash 脚本的绝对路径,而 'dir' 是工作目录。

当我运行我的程序时,我得到一个退出代码 127(“找不到命令”)。我尝试过使用 Java Runtime 类和 process.exec 方法,但都没有为我工作。有什么建议么?

0 投票
3 回答
994 浏览

java - GWT + ProcessBuilder

是否可以将 ProcessBuilder 与 GWT 一起使用?当我声明一个新 ProcessBuilder 的实例时,我得到:

0 投票
1 回答
695 浏览

java - 通过 Java ProccesBuilder 运行命令与在 Shell 中运行命令不同

我正在努力弄清楚为什么我使用 ProcessBuilder & Process 通过 Java 执行的命令不起作用。我在 Windows 命令行上运行“相同”命令,它按预期工作。一定是它们不一样,但我一生都无法弄清楚为什么。

命令是这样的:

输出应该是我需要抓取并设置为环境变量的单行字符串(因此 v. 的基本用法BufferedReader)。

我的 Java 代码在运行命令时出现应用程序错误,如下所示,入口点为startCCMAndGetCCMAddress()

的输出System.err.println(...)是:

0 投票
9 回答
36046 浏览

java - 什么会导致 Java 在 System.exit() 之后继续运行?

我有一个 Java 程序,它是通过ProcessBuilder另一个 Java 程序启动的。 System.exit(0)从子程序调用,但对于我们的一些用户(在 Windows 上),java.exe与子程序关联的进程不会终止。子程序没有关闭钩子,也没有SecurityManager可能停止System.exit()终止 VM 的钩子。我自己无法在 Linux 或 Windows Vista 上重现该问题。到目前为止,该问题的唯一报告来自两名 Windows XP 用户和一名 Vista 用户,他们使用两种不同的 JRE(1.6.0_15 和 1.6.0_18),但他们每次都能重现该问题。

任何人都可以提出 JVM 无法在 之后终止的原因System.exit(),然后仅在某些机器上?

编辑 1:我让用户安装 JDK,以便我们可以从有问题的 VM 中获取线程转储。用户告诉我的是,只要他单击菜单中的“退出”项,VM 进程就会从 VisualVM 中消失 --- 但是,根据 Windows 任务管理器,该进程并没有终止,无论多长时间用户等待(分钟,小时),它永远不会终止。

编辑 2:我现在已经确认,Process.waitFor()在父程序中,至少有一个有问题的用户永远不会返回。所以,总结一下:子虚拟机似乎已经死了(VisualVM 甚至没有看到它),但父虚拟机仍然认为该进程是活动的,Windows 也是如此。