2

我想从Java程序中异步运行一个shell脚本——即在java程序开始执行那个shell脚本之后,它会继续执行其他操作——并且只有当shell脚本返回一个响应时才会做一些进一步的工作.. 即它不会显式停止并等待 shell 脚本的响应。

这可能/可行吗?我如何实现这样的功能?

基本上,我将使用单个服务器监控多个服务器,该服务器将管理所有这些服务器——为此,它将在每个服务器上运行 shell 脚本......因为有很多服务器,并且在 java 中它建议不要使用线程数超过 cpu 核心的数量...因此我需要一个不依赖于线程的解决方案(由于线程限制)...这样我就可以同时(或几乎同时)触发许多这样的 shell 脚本而无需等待其中一个脚本响应”(因为等待会影响其他 shell 脚本命令的处理)......另一个问题.. shell 命令需要在本地机器或远程机器上调用,并且需要两种类型的响应shell脚本执行(即本地执行和远程执行)...

4

3 回答 3

5

你试过什么吗?

您可以尝试以下方法:

ProcessBuilder builder = new ProcessBuilder("your command to launch script");
Process process = builder.start();

默认情况下它不会等待该过程完成,因此您可以接下来执行您的代码。

如果您想在流程完成后进行一些处理,您可以尝试:

int exitVal = process.waitFor();
于 2013-01-07T06:34:08.503 回答
2

当您执行另一个进程并希望从中获取结果时,您通常必须读取该进程的输出,因为如果其输出缓冲区已满,该进程可能会阻塞。实现这一点的最简单方法是在 Java 应用程序中设置一个线程,该线程启动脚本,然后将其输出读入某个缓冲区。Java 应用程序的其他线程可以做他们想做的任何事情,如果进程完成,线程可以向其他人发出关于该事件的信号,然后终止。

我不知道您不使用比 CPU 更多的线程的建议是从哪里来的,但我一般不会坚持这一点。这对于工作线程来说是正确的,其中每个活动线程都让一个核心保持忙碌,但在您的情况下,大多数线程大部分时间都是空闲的。即使与空闲线程相关,也会有一些操作系统级别的资源开销,因此如果确实有很多进程,使用单个线程从所有流中读取会更好,但会复杂得多。

于 2013-01-07T06:30:53.993 回答
0

您可以在与应用程序主线程不同的线程中使用 Runtime.exec 或 ProcessBuilder 来异步运行您的 shell 脚本。

这篇文章展示了如何使用 Runtime 或 ProcessBuilder。如果您不了解,请阅读这篇文章以学习 Java 线程。

于 2013-01-07T06:33:55.840 回答