我的朋友在面试中被问到以下问题:
您将如何确保一次只有一个应用程序实例(如 tomcat)在运行?
当应用程序的另一个实例启动时,应显示一条错误消息,说明一个实例已在运行
当应用程序异常终止时,我们应该能够启动应用程序。
我对上述问题的回答涉及端口。有没有人对上述问题有“更深入”的了解?
我的朋友在面试中被问到以下问题:
您将如何确保一次只有一个应用程序实例(如 tomcat)在运行?
当应用程序的另一个实例启动时,应显示一条错误消息,说明一个实例已在运行
当应用程序异常终止时,我们应该能够启动应用程序。
我对上述问题的回答涉及端口。有没有人对上述问题有“更深入”的了解?
我建议您使用“PID 文件”。
例如,您可以在启动应用程序时创建一个 PID 文件(例如,在 下/var/run/mypgm.pid
)。在该 pid 文件中,您存储应用程序的 PID(进程 ID)。当您关闭应用程序(清理)时,您会删除该 PID 文件。
现在,当您第二次启动应用程序时,您检查该 PID 文件是否存在。如果文件存在,您有两个选择:
现在您可以解析该 PID 文件以检查是否仍有进程使用该 PID 运行。如果是这样,您将显示错误消息。如果没有,您只需删除 PID 文件并启动您的应用程序。
java.nio.channels.FileLock可以帮助您匹配所有三个点(包括异常终止情况)。
例子在这里。
检查应用程序已经运行的场景的几种可能性,我相信还有更多:
一旦检测到实例正在运行,如果实例已经在运行,则显示一条消息是微不足道的(只需显示消息并退出)
编辑:如果您的应用程序崩溃后另一个进程收到相同的 PID,使用 PID 文件的@ortang 仍然会导致问题。在这种情况下,除非您手动删除文件,否则您的应用程序将无法启动。