我使用Amazon EC2实例通过使用AWS Java SDK执行一些复杂的计算,这些计算有时可能需要很长时间。因此,我需要从我的Java代码远程杀死在EC2实例上运行的进程,这样我就可以将同一个实例重用于另一个任务而无需停止和启动实例。
停止和开始的问题是,亚马逊将部分时间视为完整时间,因此我的目标是使我的代码更具成本效益。
我使用SSH连接我的EC2实例,这就是我传递命令在那里执行的方式。我怀疑如果我断开SSH连接并再次连接它,它会杀死在那里运行的任何进程。
简而言之,我需要的是远离Ctrl + C,而是来自我的Java代码(无需用户干预)。这可能吗?
编辑: 为了澄清,计算由安装在Linux EC2实例上的单独工具执行。所以我只是通过命令启动此工具,然后命令行等待直到完成并显示结果。在手动使用场景中,我可以在linux命令行上单击Ctrl + C,然后将控制命令行。但就我而言,如果可能的话,我想从java代码中做类似的事情。
答案 0 :(得分:0)
使用SIGAR library扫描计算机上的进程列表并终止进程。
使用getProcList()获取所有进程ID,getProcArgs()获取每个进程的完整命令行,使用kill()来获取相关进程。
因此,如果任务正在运行并且您想要将其终止,请再次通过SSH连接到计算机并运行基于SIGAR的进程杀手。
答案 1 :(得分:0)
一种脏/功能方式是使用java Runtime
通过SSH终止你的进程来执行它。
像
这样的东西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");
请注意,您通常必须为通过运行时调用的可执行文件提供绝对路径。
因此,您必须使用/bin/ssh
或/usr/bin/ssh
以及kill
和pkill
或killall
替换ssh。