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

java - 使用 Apache Commons Exec 时如何分别收集标准输出和标准错误?

下面的代码获取所有输出,无论是标准输出还是标准错误。

如何分别获取两个流?

0 投票
1 回答
973 浏览

java - Java SE 的 ManagedExecutorService、ManagedTask 和 ManagedTaskListener 替代方案

我最近使用 GlassFish / Payara 构建了一个 Java EE 7 Web 应用程序。Web 应用程序在底层操作系统上按需启动长时间运行的任务(> 2 小时)。这些任务基本上是用 Python、Ruby 或 Java 编写并使用命令行 (Apache Commons Exec) 执行的其他程序或脚本。由于我想通知用户任务的当前状态并让他能够取消正在运行的任务,因此我使用了以下 Java EE 功能和库。

以下列表简要描述了我决定使用特定 Java EE 功能或外部库的原因。

  • ManagedExecutorService
    • 使用@Resource 注入,允许我对 Runnables 进行排队并在自己的线程中执行它们
  • ManagedTaskListener 实现
    • 这就是我实际上决定使用 ManagedExecutorService 并在应用程序服务器中运行线程的原因
    • 该界面给了我四个非常方便的方法(taskSubmitted、taskAborted、taskDone 和 taskStarting)
    • 这使我能够更新长期运行的任务状态 (JPA) 并在发生状态更改时通知用户
  • 可运行的托管任务实现
    • 在这里,我通过覆盖 run() 方法定义了实际的长时间运行任务
    • 为了对状态变化做出反应,我还注册了 ManagedTaskListener 实现,如前所述
  • Apache Commons Exec 实用程序
    • 要实际执行长时间运行的任务,Runnable 和 ManagedTask 实现只需使用 apache commons exec
    • 为了能够取消长时间运行的进程,我为每个 DefaultExecutor 设置了一个 ShutdownHookProcessDestroyer
    • 使用 defaultExecutor.getWatchdog().destroyProcess(); 这让我可以杀死正在运行的任务

我知道将 ManagedExecutorService 与 ManagedTasks 结合使用来执行如此长时间运行的任务并不是最好的主意,但它工作得相当稳定。

但是知道我想在不同的物理机器上运行这些长时间运行的任务,并只使用 Java SE 来执行它们。这意味着我没有 ManagedExecutorService,因此没有 ManagedTaskListener 接口。

有没有人有这种情况的经验?也许有提供类似功能的库。我认为 Google Guava 提供了一些类似方向但不提供相同功能的东西。

我也感谢其他解决方案。

非常感谢!

0 投票
0 回答
617 浏览

java - Java Apache Commons Exec Watchdog 和 Windows cmd.exe 问题

我正在尝试为我的程序使用看门狗,但如果我使用 cmd.exe 启动它,它就不起作用。如果进程是本机启动的(没有 cmd.exe),Watchdog 会终止该进程,但如果程序是使用 cmd.exe 启动的,它什么也不做。

工作代码示例:

将命令更改为此,将永远阻塞线程('mysql' 等待用户输入):

你有什么想法,如何解决这个问题?'mysql' 命令应该在新的 cmd.exe 窗口中运行。

0 投票
1 回答
3870 浏览

java - Apache Commons Exec - 有时线程无法在 Linux 中打开本地文件

警告——原因不是缺少文件——所有线程都在调用相同的脚本文件

我正在启动 5-6 个线程,这些线程在 Red Hat 框中调用本地脚本。

我注意到有时,我收到以下错误消息

显然,所有进程都在执行脚本,所以这似乎与 [1] OS 对可以运行脚本或访问文件以进行读取的同时进程有一些限制或 [2] Java 试图在一些尚未准备好的流(我假设 commons-exec 会为我处理这个问题)

这是代码

如果错误是 [1],那么我想知道如何在 linux OS 中放宽这个限制

如果错误是 [2],那么我想知道如何告诉 commons-exec 等待资源准备好(在最坏的情况下,我只会添加一些重试,但我认为这不是很优雅的)

如果错误是其他原因,至少知道原因足以让我找到解决方案。

更新 - 3月15日

好吧,事情就是这样。

该脚本是一个使用库调用Java 类的expect 脚本。

我注意到的一件事是脚本运行良好,直到它调用创建数据库连接的 java 方法。

因为线程数少(3~5)我不认为这是数据库的问题。相反,在我看来,在调用 java 代码和/或 java 代码创建数据库连接时,某些东西阻止了要调用的脚本。

我仍在尝试获取确切的异常,但期望脚本看起来像这样(有点)

pullNextInputData 看起来像

getConnection() 只是一个常规的驱动程序实例化代码,例如(它使用 apache dbutils)

一旦我得到一个堆栈跟踪,我就会把它放在这里

更新 - 3月16日

堆栈跟踪并没有说太多:-(

0 投票
1 回答
1091 浏览

java - 在 Windows 中使用 apache.commons.exec 执行带参数的 shell 脚本

我正在尝试使用 apache-commons-exec 运行脚本,该脚本是使用 java 近似来实现的。此脚本在生产服务器 (Linux) 中执行,但我需要在我的本地主机中对其进行测试以查看一切正常。

这是我启动 cygwin 的代码,该代码在 cmd.exe 中运行,但是当我尝试使用 commons.exec 启动它时它不起作用:

它返回 1 并且没有输出或日志错误:

有什么遗漏吗?如何正确捕获输出?

0 投票
2 回答
1432 浏览

java - 尝试使用 apache commons-exec jar 打开 cmd 时出错

我正在尝试从 apache commons-exec 进行 mysql 转储,但出现以下错误

线程“main”java.io.IOException 中的异常:无法运行程序“cmd.exe \c”(在目录“.”中):CreateProcess 错误=2,系统找不到 java.lang.ProcessBuilder.start 中指定的文件(ProcessBuilder.java:470) 在 java.lang.Runtime.exec(Runtime.java:593) 在 org.apache.commons.exec.launcher.Java13CommandLauncher.exec(Java13CommandLauncher.java:61) 在 org.apache.commons。 org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:336) 在 org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:166) 的 exec.DefaultExecutor.launch(DefaultExecutor.java:279)在 org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:153) 在 com.etq.e2mc.platform.windows.WindowsProcess.execCommons(WindowsProcess.java:87) 在 com.etq.e2mc。platform.windows.WindowsProcess.main(WindowsProcess.java:79) Caused by: java.io.IOException: CreateProcess error=2, 系统在 java.lang.ProcessImpl.create(Native Method) 中找不到指定的文件。 lang.ProcessImpl.(ProcessImpl.java:177) 在 java.lang.ProcessImpl.start(ProcessImpl.java:28) 在 java.lang.ProcessBuilder.start(ProcessBuilder.java:452) ... 还有 8 个

这是我正在使用的代码,它非常简单直接,但我不知道为什么它不调用 cmd(注意:尝试在没有 cmd 的情况下直接调用 mysql dump 并且我得到相同类型的错误),将不胜感激任何帮助

0 投票
2 回答
326 浏览

java - Java 不使用 Apache commons exec 执行 shellscript 中的所有命令

我在这里遇到了如此奇怪的行为。

我有以下方法:

这是脚本:ism_check_cron.ksh 我正在尝试执行:

当我查看 systemOut 的输出时,我只看到:

crontab -l 应该列出许多其他字符串,如上述字符串,但如您所见,我通过 Java 什么也没得到。

如果我在 Linux 终端中执行脚本,它工作正常。由于 Java 可以执行脚本的“某些部分”,我还假设该方法也很好。所以我完全迷路了。有什么提示吗?

======== 更新 =========

问题解决了,以后的读者可以参考下面的评论。

0 投票
1 回答
1274 浏览

java - Apache Commons Exec 更改 PATH 并执行 virtualenv 的 pip

我在使用 Apache Commons Exec 库来更改 PATH 环境变量以指向我的目标目录中创建的 Python virtualenv 时遇到了一些困难。

理想情况下,我想要的东西相当于激活 Python virtualenv,但在 Java 中。据我所知,最好的方法是更改​​环境变量,以便在我之前发现它的 pip 和 python 可执行文件othervenv(这是我主要使用的另一个 virtualenv)。

我的PluginUtils课堂上有这个方法:

然后这个类调用这个方法。

其输出如下:

我很困惑为什么which pip在运行pip调用不正确的可执行文件时会返回正确的 pip 可执行文件。我可以venvPip直接使用安装 jinja2,但我想避免将绝对路径传递给 pip,而是让它在 PATH 上可发现。

我认为可能存在竞争条件,但我添加了DefaultExecuteResultHandler所有子流程调用都是同步的,这似乎没有帮助。

0 投票
1 回答
515 浏览

java - PumpStreamHandler 可以实时捕获流程输出

我尝试通过 apache-commons-exec 捕获 python 进程输出。但看起来它不会打印输出,只有在我的python进程完成后才会显示输出。

这是我的java代码

这是我要执行的python代码(我只在python进程退出后才得到输出,但我想要的是实时得到输出)

0 投票
1 回答
1110 浏览

java - 杀死由 org.apache.commons.executor 启动的进程

我通过以下代码通过 apache commons executor 库开始执行 testng.xml:

但我想给一个停止按钮来停止这个过程。我试过了 :

但这只会破坏看门狗。但是我开始的 testng.xml 继续在后台运行。我想破坏我在命令中给出的进程。这可能吗?