java 如何远程终止amazon EC2 linux示例上的进程

rdrgkggo  于 2023-01-24  发布在  Java
关注(0)|答案(2)|浏览(183)

我使用Amazon EC2示例通过AWS Java SDK执行一些复杂的计算,这些计算有时可能需要很长时间。因此,我需要从Java代码远程终止EC2示例上运行的进程,以便我可以在另一个任务中重用相同的示例,而无需停止和启动示例。
停止和开始的问题是,亚马逊将部分小时视为完整小时,所以我的目标是使我的代码更具成本效益。
我使用SSH连接EC2示例,这就是我传递命令的方式。我怀疑如果我断开SSH连接并再次连接,它是否会杀死那里运行的任何进程。
简而言之,我需要的是在Java代码中(没有用户干预)执行Ctrl+C,这可能吗?
编辑:澄清一下,计算是由安装在Linux EC2示例上的一个单独的工具执行的。因此,我只是传递命令来启动这个工具,然后命令行等待,直到它完成并显示结果。在手动使用场景中,我可以单击Linux命令行上的Ctrl+C,然后将重新获得对命令行的控制。但在我的情况下,如果可能的话,我希望从java代码中做类似的事情。

ruoxqz4g

ruoxqz4g1#

使用SIGAR library扫描计算机上的进程列表并终止您的进程。
使用getProcList()获取所有进程ID,使用getProcArgs()获取每个进程的完整命令行,使用kill()终止相关进程。
因此,如果一个任务正在运行,而您想终止它,那么可以再次使用SSH连接到机器,然后运行基于SIGAR的进程终止器。

kmbjn2e3

kmbjn2e32#

一种肮脏的/功能性的方法是通过SSH使用java Runtime来执行进程。
就像

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/ssh/usr/bin/ssh,以及killpkillkillall

相关问题