一个jvm中的java进程是不是有可能杀死/停止另一个jvm中的另一个java进程?
Posted
技术标签:
【中文标题】一个jvm中的java进程是不是有可能杀死/停止另一个jvm中的另一个java进程?【英文标题】:Is it possible for a java process in one jvm to kill/stop another java process in another jvm?一个jvm中的java进程是否有可能杀死/停止另一个jvm中的另一个java进程? 【发布时间】:2012-02-13 06:51:57 【问题描述】:如果是这样,我怎样才能找出它是哪个进程(系统上的所有其他进程)以及如何杀死它以便执行它的shutdownhook?
我想这样做的原因是因为我想实现 apache start、apache stop 之类的东西,在调用 apache start 或 apache stop 之后,服务器进程在后台启动或停止,我得到命令或 bash 提示符;这应该适用于 linux 和 windows。
【问题讨论】:
【参考方案1】:这是可能的,但它是特定于操作系统的。 JVM 中没有任何内容可以自动授予您杀死其他 VM 的权限。
您需要调用操作系统的kill
命令(或等效命令)或编写一些本机代码。
这是可以做到的,如果你只打算在类unix系统上运行,那么你最好的选择是编写一个你想要的shell脚本,然后用ProcessBuilder
和朋友执行它.
【讨论】:
【参考方案2】:你可以考虑在服务端打开一个服务,用于关闭自身,由主应用程序处理。
另一方面,如果你不想这样做,你需要找到一种方法来获取 jvm 实例的进程。如果你只是想杀死jvm,这很容易,但对于一个特定的进程。我认为你需要一些帮助,比如:
link
希望对你有用
【讨论】:
我考虑过套接字的事情,但决定反对,因为服务器向世界公开另一个套接字是相当冒险的,任何人都可以向它发送虚假消息(即使启用了 SSL ) 除非该套接字当然只侦听来自本地主机而不是通过网络的连接,这可能吗? 当然可以。您可以为您的主应用程序定义对防火墙的权限,并防止您的系统受到攻击。而且,我认为将关闭应用程序的责任交给应用程序本身是一件好事。【参考方案3】:我认为你可以使用 JMX。
您可以在您的 java 进程中启动 JMX 服务器,并打开一些 API,例如启动和停止。
使用 JMX,您无需实现任何有关套接字和权限的内容。您只需要使用 JMX 提供一个由远程调用的函数。您还可以设置访问用户和密码。
【讨论】:
以上是关于一个jvm中的java进程是不是有可能杀死/停止另一个jvm中的另一个java进程?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用信号调用同一进程中的另一个线程在轮询函数上休眠的进程而不杀死它?
powershell 杀死IntelliJ java进程(在IntelliJ中停止Tomcat调试会话时,某些进程未被杀死并保持阻塞端口1099)