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