0

我的朋友在面试中被问到以下问题:

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

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

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

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

4

3 回答 3

12

我建议您使用“PID 文件”。

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

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

  • 您的应用程序仍在运行
  • 您的应用程序崩溃了,pid 文件仍然存在。

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

于 2012-04-16T09:18:51.513 回答
1

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

例子在这里

于 2012-04-16T09:53:54.440 回答
0

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

  1. 检查是否没有其他同名进程正在运行(如果存在同名应用程序的问题,但不太可能)
  2. 使用文件作为锁(但如果崩溃可能会导致问题)

一旦检测到实例正在运行,如果实例已经在运行,则显示一条消息是微不足道的(只需显示消息并退出)

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

于 2012-04-16T09:14:51.667 回答