问题标签 [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.
java - 使用 Apache Commons Exec 时如何分别收集标准输出和标准错误?
下面的代码获取所有输出,无论是标准输出还是标准错误。
如何分别获取两个流?
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 提供了一些类似方向但不提供相同功能的东西。
我也感谢其他解决方案。
非常感谢!
java - Java Apache Commons Exec Watchdog 和 Windows cmd.exe 问题
我正在尝试为我的程序使用看门狗,但如果我使用 cmd.exe 启动它,它就不起作用。如果进程是本机启动的(没有 cmd.exe),Watchdog 会终止该进程,但如果程序是使用 cmd.exe 启动的,它什么也不做。
工作代码示例:
将命令更改为此,将永远阻塞线程('mysql' 等待用户输入):
你有什么想法,如何解决这个问题?'mysql' 命令应该在新的 cmd.exe 窗口中运行。
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日
堆栈跟踪并没有说太多:-(
java - 在 Windows 中使用 apache.commons.exec 执行带参数的 shell 脚本
我正在尝试使用 apache-commons-exec 运行脚本,该脚本是使用 java 近似来实现的。此脚本在生产服务器 (Linux) 中执行,但我需要在我的本地主机中对其进行测试以查看一切正常。
这是我启动 cygwin 的代码,该代码在 cmd.exe 中运行,但是当我尝试使用 commons.exec 启动它时它不起作用:
它返回 1 并且没有输出或日志错误:
有什么遗漏吗?如何正确捕获输出?
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 并且我得到相同类型的错误),将不胜感激任何帮助
java - Java 不使用 Apache commons exec 执行 shellscript 中的所有命令
我在这里遇到了如此奇怪的行为。
我有以下方法:
这是脚本:ism_check_cron.ksh 我正在尝试执行:
当我查看 systemOut 的输出时,我只看到:
crontab -l 应该列出许多其他字符串,如上述字符串,但如您所见,我通过 Java 什么也没得到。
如果我在 Linux 终端中执行脚本,它工作正常。由于 Java 可以执行脚本的“某些部分”,我还假设该方法也很好。所以我完全迷路了。有什么提示吗?
======== 更新 =========
问题解决了,以后的读者可以参考下面的评论。
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
所有子流程调用都是同步的,这似乎没有帮助。
java - PumpStreamHandler 可以实时捕获流程输出
我尝试通过 apache-commons-exec 捕获 python 进程输出。但看起来它不会打印输出,只有在我的python进程完成后才会显示输出。
这是我的java代码
这是我要执行的python代码(我只在python进程退出后才得到输出,但我想要的是实时得到输出)
java - 杀死由 org.apache.commons.executor 启动的进程
我通过以下代码通过 apache commons executor 库开始执行 testng.xml:
但我想给一个停止按钮来停止这个过程。我试过了 :
但这只会破坏看门狗。但是我开始的 testng.xml 继续在后台运行。我想破坏我在命令中给出的进程。这可能吗?