防止jar的多个实例运行

创新思想家

我的中间层jar文件在linux服务器上运行。我希望该jar文件在后台不间断运行。

nohup java -jar RushMiddleLayer.jar &

但是,当我重新运行此命令时,创建并运行了jar的另一个新实例。

我已经通过谷歌搜索。他们提出了一些选择。“绑定ServerSocket”。但这对我不起作用。按下Enter键或Ctrl + C后,进程被杀死。

我想从罐子中获得两个好处。一个总是以失败告终。如果使用同一命令重新启动jar,则使用另一个命令(nohup java -jar RushMiddleLayer.jar&)。它应该替换现有的jar,而不是创建新的实例。

杰米·里德(Jamie Reid)

只是为了确保我了解您想要什么,您想要一个在后台运行的jar文件,并且它只能被启动一次?

如果这是您想要的,有两种方法可以实现:

  1. 使用端口作为信号量(如您建议的那样)
  2. 使用文件作为信号量。

对于选项1,

代码应该像下面这样简单:

try {
    serverSocket = new ServerSocket(port);
} catch (IOException e) {
    System.out.println("Could not listen on port: " + port);
    // ...
}

一个IOException异常将被抛出,如果你能在这个端口上没有打开服务器套接字。但是,如果某些其他应用程序正在使用此端口,也会发生这种情况。因此,请小心选择哪个端口号。

对于选项2,您只需使用FileWriter并创建一个虚拟文件,并将此文件保持打开状态,直到jar /程序完成(或关闭)。当第二个jar实例尝试打开时,将抛出一个异常,并且将无法启动,这是因为它将尝试打开要写入的文件,从而产生IOException,因为只有一个进程可以具有一个IOException。同时将句柄写入文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章