一次只有一个应用程序实例

时间:2012-04-16 09:05:52

标签: java

我的朋友在接受采访时提到了以下问题:

  1. 您如何确保一次只运行一个应用程序实例(如tomcat)?

  2. 当启动另一个应用程序实例时,应显示一条错误消息,指出一个实例已在运行

  3. 当应用程序异常终止时,我们应该能够启动该应用程序。

  4. 我对上述问题的回答涉及端口。有没有人对上述问题有“更深入”的理解?

3 个答案:

答案 0 :(得分:12)

我建议您使用" PID文件"。

例如,您可以在启动应用程序时创建PID文件(例如,在/var/run/mypgm.pid下)。在该pid文件中,您存储应用程序的PID(进程ID)。当您关闭应用程序(清理)时,您将删除该PID文件。

现在,当您第二次启动应用程序时,检查该PID文件是否存在。如果文件存在,您有两个选择:

  • 您的应用程序仍在运行
  • 你的应用程序崩溃,pid文件仍在那里。

现在,您可以解析该PID文件,以检查是否仍有一个运行该PID的进程。如果是这样,您将显示错误消息。如果没有,您只需删除PID文件并启动您的应用程序。

答案 1 :(得分:1)

java.nio.channels.FileLock可以帮助您匹配所有三个点(包括异常终止案例)。

示例是here

答案 2 :(得分:0)

检查已经运行的应用程序的几种可能性,我相信还有更多:

  1. 检查没有其他具有相同名称的进程已在运行(如果有一个具有相同名称的应用程序,则会出现问题,但不太可能)
  2. 将文件用作锁(但如果崩溃可能会导致问题)
  3. 如果实例已在运行,则在您检测到它正在运行时显示一条消息(只显示该消息并退出)

    编辑:如果另一个进程在应用程序崩溃后收到相同的PID,使用PID文件的@ortang仍然会导致问题。在这种情况下,除非您手动删除文件,否则您的应用程序将无法启动。