我使用Amazon EC2示例通过AWS Java SDK执行一些复杂的计算,这些计算有时可能需要很长时间。因此,我需要从Java代码远程终止EC2示例上运行的进程,以便我可以在另一个任务中重用相同的示例,而无需停止和启动示例。
停止和开始的问题是,亚马逊将部分小时视为完整小时,所以我的目标是使我的代码更具成本效益。
我使用SSH连接EC2示例,这就是我传递命令的方式。我怀疑如果我断开SSH连接并再次连接,它是否会杀死那里运行的任何进程。
简而言之,我需要的是在Java代码中(没有用户干预)执行Ctrl+C,这可能吗?
编辑:澄清一下,计算是由安装在Linux EC2示例上的一个单独的工具执行的。因此,我只是传递命令来启动这个工具,然后命令行等待,直到它完成并显示结果。在手动使用场景中,我可以单击Linux命令行上的Ctrl+C,然后将重新获得对命令行的控制。但在我的情况下,如果可能的话,我希望从java代码中做类似的事情。
2条答案
按热度按时间ruoxqz4g1#
使用SIGAR library扫描计算机上的进程列表并终止您的进程。
使用getProcList()获取所有进程ID,使用getProcArgs()获取每个进程的完整命令行,使用kill()终止相关进程。
因此,如果一个任务正在运行,而您想终止它,那么可以再次使用SSH连接到机器,然后运行基于SIGAR的进程终止器。
kmbjn2e32#
一种肮脏的/功能性的方法是通过SSH使用java
Runtime
来执行进程。就像
因此,在您的情况下,如果您知道程序的PID(例如1234):
或者,如果您知道该程序的名称:
注意,通常必须给出通过运行时调用的可执行文件的绝对路径。
因此,您必须将ssh替换为
/bin/ssh
或/usr/bin/ssh
,以及kill
和pkill
或killall
。