0

我使用 Amazon EC2 实例通过 AWS Java SDK 执行一些复杂的计算,这些计算有时可能需要很长时间。因此,我需要从我的 Java 代码远程终止在 EC2 实例上运行的进程,以便我可以将同一实例重用于另一个任务,而无需停止和启动该实例。

停止和启动的问题在于,亚马逊将部分时间视为完整时间,所以我的目标是让我的代码更具成本效益。

我使用 SSH 连接我的 EC2 实例,这就是我传递要在那里执行的命令的方式。我怀疑如果我断开 SSH 连接并再次连接它,它会杀死那里运行的任何进程。

简而言之,我需要的不是 Ctrl+C,而是在我的 Java 代码中(无需用户干预)。那可能吗?

编辑:为了澄清,计算是由安装在 Linux EC2 实例上的单独工具执行的。所以我只是通过命令来启动这个工具,然后命令行等待它完成并显示结果。在手动使用场景下,我可以在 linux 命令行上单击 Ctrl+C 并重新获得对命令行的控制权。但就我而言,如果可能的话,我想从 java 代码中做类似的事情。

4

2 回答 2

0

使用SIGAR 库扫描机器上的进程列表并终止您的进程。

使用getProcList()获取所有进程 ID,使用 getProcArgs( )获取每个进程的完整命令行,使用kill()杀死相关进程。

因此,如果一个任务正在运行并且您想终止它,请再次通过 SSH 连接到机器并运行基于 SIGAR 的进程终止程序。

于 2013-10-11T17:20:35.727 回答
0

一种肮脏/实用的方法是通过 SSH 使用 javaRuntime来执行它来杀死你的进程。

就像是

Runtime runtime = Runtime.getRuntime();
Process p = runtime.exec("ssh user@host command");

因此,在您的情况下,如果您知道程序的 PID(例如 1234):

Process p = runtime.exec("ssh user@host kill 1234");

或者,如果您知道程序的名称:

Process p = runtime.exec("ssh user@host pkill my_program_name_x64");

请注意,您通常必须提供通过运行时调用的可执行文件的绝对路径。

因此,您必须将 ssh 替换为/bin/sshor/usr/bin/ssh以及 for killand pkillor之类的东西killall

于 2013-10-12T06:42:39.880 回答