【问题标题】:Prevent multiple instance of jar running防止多个jar实例运行
【发布时间】:2015-04-22 22:59:25
【问题描述】:

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

nohup java -jar RushMiddleLayer.jar &

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

我已经通过谷歌搜索。他们提出了一些选择。 “绑定一个服务器套接字”。但这对我不起作用。按回车或Ctrl+C后进程被杀死。

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

【问题讨论】:

    标签: java linux ubuntu jar


    【解决方案1】:

    只是为了确保我理解你想要的,你想要一个在后台运行的 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,因为只有一个进程可以有同时写入文件句柄。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      相关资源
      最近更新 更多