防止 jar 的多个实例 运行

Prevent multiple instance of jar running

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

nohup java -jar RushMiddleLayer.jar &

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

我已经搜索过 google。他们提出了一些选择。 "Bind a ServerSocket"。但这对我不起作用。按 Enter 或 Ctrl+C 后进程终止。

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

为了确保我明白你想要什么,你想要一个在后台运行并且只能启动一次的 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/program 完成(或关闭)。当 jar 的第二个实例尝试打开时,将抛出异常并且它将无法启动,因为它将尝试打开文件进行写入,这会产生 IOException 因为只有一个进程可以有一个同时写入文件句柄。