问题标签 [apache-commons-exec]

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 投票
5 回答
9367 浏览

java - 如何使用 commons-exec 执行 /bin/sh?

这就是我正在做的事情:

这是输出:

我究竟做错了什么?

0 投票
3 回答
1764 浏览

java - 如何防止 Apache Commons Exec 的日志输出

我在 JBoss 4.2.3 的 Web 应用程序上使用 Apache Commons Exec。每当我调用 Apache Exec 时,它都会在日志中输出所有控制台输出,这是很多输出,它可以轻松地在生产环境中填充我的日志。如何防止打印此日志并仅显示错误日志?

问候

0 投票
3 回答
7962 浏览

java - 优雅地杀死 Apache Commons Exec 进程

我正在我的 Java 程序(在 Linux 上)中启动一个外部进程,我需要能够向它发送一个 SIGTERM 信号而不是exec.getWatchdog().destroyProcess()发送的 SIGKILL。有没有一种方法可以更优雅地停止以 commons-exec 启动的 unix 进程?或者我可以获取 PID,以便我可以自己运行适当的 kill 命令?

0 投票
2 回答
1858 浏览

java - 在 Commons Exec 中处理 CommandLine 的空参数

我正在尝试执行一个从 Java 获取 3 个参数的 bash 脚本,以下是我创建命令行的代码

当我传递非空参数时,这就像一个魅力。但不能正常工作,因为参数之一为空(即“”)

详细地说,在某些情况下 Param2 = ""。现在执行 bash 脚本时,不考虑 Param2 = "",而是采用 Param2 = Param 3(值)和 Param3 = undefined。

我该如何阻止这种情况发生?

编辑:Param1、Param2 和 Param3 实际上是传递给 bash 脚本的文件名。其中,Param1 => File1,Param2 => 文件 2 & Param3 => 输出文件

Bash 脚本实际上是在文件 1 上调用并生成一些指标并将其存储在输出文件中。生成指标时,会生成 2 类指标。

  1. 绝对
  2. 相对的

绝对值是在文件 1 上生成的,而相对值是在比较文件 1 和文件 2 之后生成的。在 bash 脚本中,如果文件 2 没有作为参数传入,则我有条件,不要生成相对指标。

这就是设计。现在,当没有文件 2 进行比较时,问题就出现了,在这种情况下,我希望生成绝对指标,而忽略相对指标。

但是现在发生在我身上的是参数 3(即输出文件)被认为是文件 2(这完全是不受欢迎的),而我的相对指标生成需要折腾。

使用 Runtime.getRuntime().exec 时,我可以通过引用它来做到这一点。即 /bin/bash Script Param1 "" Param3 这就像一个魅力。

在我尝试减少代码并获得良好的跨平台支持时,我引入了 commons-exec 并且问题开始出现。

所以,我的问题仍然是,如何使用 commons-exec 命令行将 Param2 的值传递和空值到 bash 脚本?

0 投票
1 回答
6314 浏览

java - 使用 PumpStreamHandler 将输出和错误写入日志文件

我一直在寻找一个很好的例子来将进程输出和错误流写入日志文件。我使用 apache-commons exec 库来执行我的进程。按照代码示例来演示

0 投票
3 回答
744 浏览

java - 从 Java 运行 shell 脚本

我正在尝试使用 commons exec 包为 Java 运行一些 shell 脚本,并使用 PumpStreamHandler 清除 STDOUT 和 STDERR 缓冲区。大多数脚本运行良好,没有任何问题,但其中一些会挂起。

特别是那些需要一些时间才能返回的脚本。我的猜测是 PumpSramHandle 可能正在读取流的结尾,因为一段时间内没有任何东西放在流上,然后缓冲区填满。

有没有更好的方法来解决这个问题?

0 投票
3 回答
1103 浏览

java - apache commons CommandLine 对象是否可以防止命令行注入?

我想使用org.apache.commons.execJava 库来调用可执行文件。该CommandLine对象是否可以防止命令行注入?例如,如果我打电话:

rm -rf ~/*除了预期的命令之外还会运行吗?如果是这样,防止这种情况的最佳方法是什么?

API 说addArgument()“处理引用”,但我不确定在这种情况下这意味着什么。我可以创建一个测试用例来看看我的 linux 机器上会发生什么,但我想确保它在其他平台上也是安全的。

0 投票
1 回答
1020 浏览

java - 在尝试运行子进程时,它只打印标准输出然后终止

我正在使用 Apache Commons Exec 并尝试启动可以在整个应用程序期间工作的子进程。它应该启动进程,接受两个输入命令,并留在后台。现在它只接受一个命令(至少 stdout 显示的)并终止。你能帮帮我吗?

0 投票
3 回答
3206 浏览

java - 使用 Apache Commons Exec 向命令提供多个输入并提取输出时出现问题

我正在编写一个需要使用 Apache Commons Exec 库的外部命令行应用程序的 Java 应用程序。我需要运行的应用程序的加载时间相当长,因此最好保持一个实例处于活动状态,而不是每次都创建一个新进程。应用程序的工作方式非常简单。一旦启动,它会等待一些新的输入并生成一些数据作为输出,这两者都使用应用程序的标准 I/O。

所以想法是执行 CommandLine,然后将 PumpStreamHandler 与三个单独的流(输出、错误和输入)一起使用,并使用这些流与应用程序交互。到目前为止,我已经在一个输入、一个输出然后应用程序关闭的基本场景中完成了这项工作。但是,一旦我尝试进行第二次交易,就会出现问题。

在创建了我的命令行之后,我创建了我的 Executor 并像这样启动它:

然后我继续启动三个不同的线程,每个线程处理一个不同的流。我还有三个处理输入和输出的同步队列(一个用作输入流的输入,一个用于通知 outputQueue 新命令已启动,一个用于输出)。例如,输入流线程如下所示:

如果我删除 while 循环并只执行一次,一切似乎都运行良好。显然,如果我再次尝试执行它,PumpStreamHandler 会抛出异常,因为它已被两个不同的线程访问。

这里的问题是,似乎 processInput 直到线程结束才真正刷新。调试时,命令行应用程序仅在线程结束时才真正接收其输入,但如果保留 while 循环,则永远不会收到它。我尝试了许多不同的方法来刷新 processInput,但似乎没有任何效果。

有没有人尝试过类似的事情?有什么我想念的吗?任何帮助将不胜感激!

0 投票
4 回答
24365 浏览

java - 处理来自 apache-commons exec 的输出

我在这里束手无策。我确信这很简单,而且我对 Java 和流的理解很可能存在巨大的漏洞。我认为有这么多的类,我有点不知所措,试图通过 API 找出我想何时以及如何使用大量输入/输出流。

我刚刚了解了 apache commons 库的存在(自学 java 失败),目前正在尝试将我的一些 Runtime.getRuntime().exec 转换为使用 commons - exec。已经修复了一些每 6 个月出现一次的问题,然后解决 exec 的风格问题。

该代码执行 perl 脚本,并在脚本运行时在 GUI 中显示脚本的标准输出。

调用代码在 swingworker 内部。

我迷失了如何使用pumpStreamHandler ...无论如何这是旧代码:

我想这就是我很久以前不完全理解的复制粘贴代码所得到的。上面我假设正在执行该过程,然后获取输出流(通过“getInputStream”?),将其放入缓冲读取器中,然后将在那里循环直到缓冲区为空。

我不明白为什么这里不需要“等待”风格的命令?是否有可能在一段时间内缓冲区为空,退出循环并在进程仍在进行时继续?当我运行它时,情况似乎并非如此。

无论如何,我正在尝试使用 commons exec 获得相同的行为,基本上再次来自谷歌找到的代码:

我试图弄清楚 pumpstreamhandler 在做什么。我假设这将从 exec 对象获取输出,并用 perl 脚本的 stdout/err 中的字节填充我提供的 OutputStream?

如果是这样,您将如何获得上述行为以使其逐行流式传输输出?在示例中,人们向您展示了最后调用 out.toString() ,我认为这只会在脚本运行完成后给我一个脚本的所有输出的转储?您将如何做到这一点,以便在逐行运行时显示输出?

------------未来编辑 ---------

通过谷歌找到这个并且效果很好: