2012-04-16 34 views
0

我的朋友在接受采访时曾提出以下问题(S):同时让应用程序只有一个实例

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

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

  3. 当应用程序异常终止,我们应该可以启动应用程序。

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

+0

请参阅http://stackoverflow.com/questions/2528844/only-one-swing-frame-window-opened-at-time/2528860#2528860 – 2012-04-16 09:11:29

+0

我也会使用一个端口。简单的答案往往是最好的,所以也许没有更深的理解。我能想到的唯一技巧是在绑定到端口之前使用'socket.setReusableAddress(true)'**。你有什么疑问? – 2012-04-16 09:11:32

回答

0

夫妇的可能性,以检查应用程序已经运行的情况下,我敢肯定有很多更多:

  1. 检查具有相同名称的其他进程已在运行(问题,如果有一个应用程序一旦你发现它的名称相同,但不太可能)
  2. 使用文件作为锁(但如果你崩溃可能导致问题)

显示,如果一个实例已在运行的消息是微不足道正在运行(只显示我并退出)

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

+0

你说得对。您可以通过以下方法缩小问题的范围:使用该PID解析程序的名称或使用某种信号处理程序(例如EXIT上的“陷阱”)来删除PID文件等。 – 2012-04-16 12:49:22

12

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

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

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

  • 你的应用程序仍在运行
  • 你的应用程序崩溃和pid文件依然存在。

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

相关问题