Eclipse: 在重新运行前终止当前进程

3
我正在开发一个使用嵌入式jetty web server的小型服务器应用程序。该服务绑定到TCP端口并在后台运行。由于应用程序不会结束(它是一个服务),因此在重新运行之前,我必须手动终止该进程(例如,因为TCP端口正在当前进程中使用)。
在Eclipse中,是否可以自动终止当前进程,然后再重新启动它?
4个回答

3

Eclipse Oxygen (4.7)

Eclipse Oxygen增加了终止并重新启动功能。

有两种可能的方法:

  1. 在单击运行按钮时按下Shift

  2. 进入窗口>首选项>运行/调试>启动>勾选启动时终止并重新启动(从菜单或工具栏启动时按“Shift”切换)>应用和关闭>运行应用程序

    Run/Debug > Launching > Terminate and Relaunch


1
你可以通过编写代码的方式来实现,而不是使用任何Eclipse配置,我觉得这样更好。在启动应用程序时,只需检查系统中正在运行的进程并搜索要启动的进程。如果发现该应用程序正在运行,请发送一个终止信号,然后继续启动。希望这有所帮助。而且,如果你没有使用Eclipse,它也能一直正常工作。 :P

“只需检查系统中正在运行的进程” - 这并不是那么简单。要按名称查找进程,您需要首先给它命名(这并不容易)。要按端口/套接字使用情况查找进程,您需要找出谁在使用该端口(如果平台无关,则不容易)。编写PID文件或类似文件是可能的,但这需要对具有固定名称的某个文件进行写访问... - steffen
@steffen,非常正确。在我们的工作场所中,我们遵循pid选项。只要文件位于您的应用程序日志目录或类似位置,拥有对某些文件的写访问权限有什么问题呢?至少这将为您提供一种更顺畅的解决问题的方法,而且主要独立于Eclipse。 - LPD

1
Jetty 还有一个 ShutdownHandler,您可以将其接入到处理程序链中,该处理程序链将接受来自本地主机的连接,并使用密钥触发正常关闭。

http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ShutdownHandler.java

另外,您可以使用对服务器对象的引用连接自己的组件,在另一个端口上侦听停止键的传递。

在命令行上,“jps”是获取Java进程列表的最有用的方法。


我使用新的Web服务模块连接了我的Jetty组件。现在我有了一个服务控制接口,可以停止和重新启动服务器。不错! - steffen

1

这是我一两年前写的代码片段,至今一直表现良好。只需添加一个包声明即可。从任何你想要杀死拥有端口的进程的地方调用此代码,例如你的main()函数。

import java.io.IOException;

public class KillPortHolderSimple {

    public static void killHolderOfPort(int port) {
        final String how = "-KILL";
        try {
            Runtime.getRuntime().exec(new String[]{"sh", "-c", "lsof -i :" + port + " -t | xargs kill " + how});
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

也许我应该补充一下,当然,使用exec和sh取决于操作系统环境。 - Jonas N
特别是lsof. 我知道如何在Windows中运行execkill, 但lsof肯定更困难。我可以解析netstat -ano的输出。但我无法相信没有任何简单的解决方案。如果可用bash, 一切都很容易,但目前我需要这个功能在Windows上。 - steffen
是的,这是个问题...关于Eclipse解决方案,我也搜索过了,但没有找到。有时在调试视图中的进程列表中会有“终止并重新启动”上下文菜单选项,但如何将其绑定到键组合...太糟糕了,Eclipse似乎没有Kill-Relaunch。我甚至希望它成为调试时的默认行为! - Jonas N
刚想到一个跨平台的解决方案……从应用程序内部轮询某个文件的 File.lastModification(),最好是在线程中实现。可能是目标/目录中的一个文件?然后要么在构建过程中写入该文件,以便进程在构建完成后立即停止。或者在新进程启动时修改它。与杀死端口所有者相比的优点:没有意外的附带损害。缺点:需要合作。 - Jonas N
目前我更倾向于使用https://dev59.com/_2zXa4cB1Zd3GeqPQys5#13915957,因为它指示前一个线程结束自身 - 你无法做得更平稳。我认为这是正确的方法。 - steffen

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