防止jar运行的多个实例

时间:2015-02-21 06:40:13

标签: java linux ubuntu jar

我在linux服务器上运行了我的中间层jar文件。我希望那个jar文件在后台不停运行。

nohup java -jar RushMiddleLayer.jar &

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

我通过谷歌搜索过。他们提出了一些选择。 "绑定ServerSocket"。但这对我不起作用。按Enter键或Ctrl + C后进程终止。

我想从jar中获得两个好处。一个人总是失败地跑步。另一个是使用相同的命令重启jar(nohup java -jar RushMiddleLayer.jar&)。 它应该替换现有的jar,而不是创建新的实例。

1 个答案:

答案 0 :(得分:0)

为了确保我理解你想要的东西,你想要一个在后台运行的jar文件,它只能一次启动一次吗?

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

  1. 使用端口作为信号量(如您所建议的那样)
  2. 使用文件作为信号量。
  3. 对于选项1,

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

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

    如果您无法在此端口上打开服务器套接字,则会抛出IOException。但是,如果某些其他应用程序正在使用此端口,也可能发生这种情况所以要小心选择哪个端口号。

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