一个JVM中的Java进程是否可以杀死/停止另一个JVM中的Java进程?

6
如果是这样,我该如何找出它是哪个进程(在系统上的所有其他进程中),并且如何杀死它以使其关闭挂钩得到执行?
我想要做这件事的原因是,我想要实现类似于apache start、apache stop的东西,在调用apache start或apache stop之后,一个服务器进程在后台启动或停止,并且我可以得到命令或bash提示符;这应该在Linux和Windows上都能工作。
3个回答

4

这是可能的,但它将取决于操作系统。JVM没有自动提供杀死其他VM的访问权限。

你需要调用操作系统的kill命令(或等效命令),或编写一些本地代码。

这是可以实现的,如果你只在类Unix系统上运行,那么最好的选择是编写一个脚本来完成你想要的操作,然后使用ProcessBuilder和相关工具来执行它。


2

您可以考虑在服务器端开放一个服务,用于关闭自身,并由主应用程序处理。

另一方面,如果您不想这样做,您需要找到一种获取jvm实例进程的方法。如果您只想杀死jvm,那么很容易,但对于特定的进程,则需要一些帮助,例如:

链接

希望这对您有所帮助。


我曾考虑过套接字的事,但最终决定放弃,因为对于一个服务器来说,暴露另一个套接字到世界上是相当危险的,任何人都可以发送伪造的消息给它(即使启用了 SSL),除非该套接字仅监听来自本地主机而非网络的连接,这有可能吗? - shawn
当然可以。您可以为主应用程序定义防火墙权限,防止系统受到攻击。此外,我认为将关闭应用程序的责任交给应用程序本身是一个好主意。 - Neron

1

我认为你可以使用JMX。

你可以在Java进程中启动JMX服务器,并打开一些API,如开始和停止。

使用JMX,你不需要实现有关套接字和权限的任何内容。你只需要提供一个通过JMX远程调用的函数。你还可以设置用户和密码以进行访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接