问题标签 [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 投票
2 回答
4397 浏览

java - 在 Java 7 中使用 ProcessBuilder 构建流程管道

我一直在试图弄清楚如何使用新的ProcessBuilder. 我找不到合适的例子来说明我想做的事情,当我尝试自己做时,过程就会挂起。我会很感激一些代码的一个非常简单的例子,它运行相当于cat test.txt | wc,但不是通过 shell。

- 更新 -

好的,只是为了澄清。我知道有一些方法可以通过读取和写入流来模拟管道。我想知道这是否是通过Java 7 中引入的redirectInputredirectOutput方法以某种自动方式完成的。

0 投票
1 回答
2071 浏览

java - Java 进程无法从 gpg.exe 捕获 InputStream、OutputStream

我正在尝试使用gpg.exe --passphrase-file my.passphrase --decrypt --output MTR241_20111124.htm MTR241_20111124.htm.gpg(没有 --batch 和 --yes 选项)进行解密。如果有人愿意将其用于测试,我还将提供加密命令gpg.exe --passphrase-file ..\BE\src\my.passphrase --symmetric --output MTR241_20111124.htm.gpg MTR241_20111124.htm

有两种情况。案例 1:输出目录中不存在 MTR241_20111124.htm 文件。exec 的命令提示符和捕获的输出流都提供相同的输出。

java exec 和命令提示符会打印相同的消息。

到目前为止足够好

案例2:当输出文件在命令提示符中已按预期存在时,它询问我是否要替换。

但是这个输出来自在第一行之后挂起的java程序。它不会在控制台上打印任何行。如果我在控制台中输入“y”,它不接受输入和处理。它只是挂起。我必须手动终止进程 taskkill /F /IM gpg.exe 只有这样 Java 控制台程序才能接受更多命令和进程。

正常的交互式命令当然可以工作,例如:

所以这是我的问题,为什么只有在询问是否替换现有输出文件时才捕获gpg的输出流。

我已经尝试过 Runtime.exec()、ProcessBuilder、Plexus-Utils、ExpectJ、Ant 在 Java 程序中运行这个 gpg.exe,它们都显示相同的结果,在这种特殊情况下无法捕获进程的输出流。我什至尝试编写一个.bat文件来运行,gpg --decrypt但即便如此,它也无法在上述特殊情况下捕获输出流。

我认为这很重要,gpg.exe 的来源。好吧,我在便携式 git 发行版中得到了它,在 bin 文件夹中 gpg.exe 可用。

我的问题变得很长很无聊,但对于那些喜欢指出错误的人来说仍然是java代码

最后一句话,如果我使用该gpg --batch选项,它不再提示y/N输入,所以它运行顺利。但我只是想知道,为什么会有这个问题。虽然我感觉 gpg.exe 最初是为类 Unix/Linux 平台编写的,所以可能会有一些输入输出文件重定向,但我想进一步了解它的根本原因,以便下次我知道是什么寻找。

0 投票
2 回答
17691 浏览

java - java.io.IOException:错误=11

我在使用 Java 时遇到了一个奇怪的问题ProcessBuilder。代码如下所示(稍微简化的形式)

不管什么.sh 内容如下:

的实例负载Whatever被提交给一个ExecutorService固定大小的 (35)。应用程序的其余部分等待它们全部完成——使用CountdownLatch. 在抛出以下异常之前,一切都运行良好几个小时(Scientific Linux 5.0,java 版本“1.6.0_24”):

有谁知道这意味着什么?根据 google/bing 的搜索结果java.io.IOException: error=11,这不是最常见的异常,我完全感到困惑。

我的疯狂且没有那么有根据的猜测是,我有太多线程试图同时启动同一个文件。但是,重现该问题需要数小时的 CPU 时间,因此我没有尝试使用较小的数字。

非常感谢任何建议。

0 投票
1 回答
51866 浏览

java - 如何使用 ProcessBuilder 设置工作目录

我正在尝试在 ubuntu 的主目录中启动一个进程。我不断收到权限被拒绝的异常,我不知道为什么。这是代码:

这是一个例外:

0 投票
2 回答
245 浏览

java - 如果父进程在启动后没有被销毁,Java process.start 会非常慢

如果我直接从命令行启动特定进程,我会看到它在 2-3 秒内完全启动。

如果我使用 Java 程序中完全相同的命令启动完全相同的进程,它会在启动时挂起,除非父级被破坏。为什么?

使用 ProcessBuilder:

使用 Runtime.exec:

无论哪种方式,如果我没有将新的 Process 对象设置为 null 并立即调用垃圾收集器,那么新进程最多需要 3 分钟才能完成它应该在 3 秒内完成的相同操作。

使用上面的代码解决了这个问题。有人可以解释我为什么吗?我认为这与 JVM 进程处理有关,但这只是一个猜测。

新进程使用 Hibernate 连接到 MySQL DB,使用 log4j 写入日志文件,从 .properties 文件中读取并连接到 RabbitMQ 服务器。

谢谢,

祝你今天过得愉快

0 投票
1 回答
116 浏览

java - 使用 Java 处理来自 MySql 的大数据

这是使用 Java 处理来自 MySql 的大数据的最佳方法。我进行了搜索,但找不到最佳解决方案。

请考虑因素 -

  1. 在处理过程中确实要锁定表。
  2. 尝试过Processbuilder,但它"java.io.IOException: error=12, Cannot allocate memory"大部分时间都在抛出。
0 投票
1 回答
1376 浏览

java - ProcessBuilder的问题

上述程序抛出以下异常:

0 投票
3 回答
502 浏览

java - 启动进程而不消耗其输出

我使用这一行从 java 应用程序执行 python 脚本:

该脚本运行一个与我的 java 应用程序和其他客户端通信的 TCP 服务器。

当我调试脚本时,我在这里和那里有一些控制台打印,一切都很好。从 Java 代码启动脚本后,经过一段固定时间后,我的 TCP 服务器没有响应。经过一段时间的调试和挫折,我从脚本中删除了我的打印,一切都按预期工作。

似乎为进程的标准输出和错误流分配了一些内存,如果您不使用它,则进程在尝试写入完整缓冲区时会卡住。

如何启动该过程以便我不必使用标准输出流?我想保留打印件以进行调试,但不想启动一个线程来读取我不需要的流。

0 投票
2 回答
624 浏览

java - 32 位 JVM、ProcessBuilder.start() 和 ENOMEM

我必须定期处理的一个应用程序使用ProcessBuilder. 由于不为人知的原因,它仍然在 32 位 JVM(Sun,1.6.0.25)上运行,即使底层操作系统是 64 位(RHEL 5.x 值得)。

这个应用程序是内存快乐的,所以堆大小设置为最大 3 GB,permgen 为 128M。

然而......在随机时刻,shell 助手无法启动。不是因为 OutOfMemory,而是 ENOMEM……我能看到的唯一原因是地址空间不足。

好吧,当然,但与此同时,内存并没有真正承受压力,并top报告说 JVM 的实际内存使用量及其虚拟集大小甚至不到 3 GB...

查看可以查看的代码Process,我看到核心方法被调用forkAndExec(),这几乎是不言自明的......根据我对这两个系统调用的了解,它不应该失败。但确实如此。而且并非总是如此。

为什么?

编辑:应该注意使用了neo4j。好像经常使用FileChannel,会不会是地址空间不足的原因?

0 投票
3 回答
5347 浏览

java - Java、Runtime.exec 或 ProcessBuilder:如何知道文件是 shell 还是二进制文件?

我正在寻找一种最有效的方式来决定:

  • 我应该在用户提供的命令行中添加 shell 可执行文件吗
  • 如果是,该可执行文件是什么?(/bin/sh?/usr/bin/perl?/usr/bin/ksh?c:/../cmd.exe?)

众所周知,要从 Java 启动 shell 脚本,应该改为启动 shell:

要启动二进制文件,应该启动二进制文件本身:

如果使用 shell 执行二进制文件,则会产生错误:

如果在没有 shell 二进制文件的情况下执行 shell 脚本,则会产生错误:

我的应用程序不知道它是从什么开始的,二进制文件还是脚本。

启动的应用程序是最终用户提供的事件处理程序。它很可能是在 Unix 下执行的 shell 脚本;但它可以是 Windows 下的 *.cmd,也可以是在某个不起眼的平台下执行的 Perl 脚本。毕竟是Java。

我第一次天真的尝试是用 shell 启动命令行,看看它是否有效。如果没有,请尝试将其作为二进制文件执行。

这是丑陋且有风险的:在平台和外壳的某种未知组合下,第二次运行可能仍然执行脚本,第二次,结果不可预测。

此外,我无法判断脚本何时启动正常并由于自身的某些问题而失败,因为我无法启动它。

我现在考虑的最好的事情是:

  • 阅读脚本并查找任何不可打印的字节
  • 如果找到,将其视为二进制文件
  • 如果没有,添加 /bin/sh (或 cmd.exe 如果在 Windows 下)

如果您有更好的想法,请告知。

更新/部分解决方案

感谢所有与我分享想法的人。

事实证明,我把自己和互联网上的其他人都弄糊涂了:)

不需要在用户输入的命令行之前添加 shall 二进制文件,前提是:

  1. 脚本在 PATH
  2. (对于 Unix)脚本是可执行的
  3. (对于 Unix)脚本有 #!/path/to/interpreter

在我测试我的代码时,这些条件中的一个或另一个没有满足。:-(

从头开始仔细执行测试后,脚本已被执行。

第3点只能由用户完成,并且必须记录在用户手册中。

由于这些脚本传播到目标系统的方式,它们可能无法执行并且可能不在 PATH 中。

我关心的唯一路径是相对路径,因此在任何相对路径之前添加 ./ 就足够了。

使脚本在 Unix(和任何其他平台)下可执行是一个更大的挑战。这不是WORA。将 /bin/sh 放在它前面可能会有所帮助,但如果我记得在 Solaris 下,shell 将不会执行不可执行的脚本。

我将在本周晚些时候发布另一个更新。