5

如何确定我的机器上是否正在运行特定的 JAR 文件?我只是想确保一个特定的 JAR 在任何时候只执行一次——所以如果另一个执行同一个 jar 的请求进来,那么我不应该再次调用那个 jar。

我可以将上述代码用作 java 代码(我将添加到该 JAR 本身)或 shellscript(我将使用它来调用 jar 文件)。

该机器将是一台 Linux 机器——CentOS、Debian、Ubuntu 或 Amazon Linux。

4

2 回答 2

6

jps是一个简单的命令行工具,可以打印出当前正在运行的 JVM 以及它们正在运行的内容。您可以从 shell 脚本调用它。

jps -l将转储 JVM 进程 ID 和它正在执行的主类。我怀疑这最适合您的要求。

注意到您的评论。jps 不受支持,如果在升级 JDK/JRE 时无法通过测试轻松缓解这种担忧,那么也许可以使用以下方法:

pgrep -lf java
于 2012-12-13T10:36:39.253 回答
3

尝试创建一个新罐子,

用这样的方法在里面创建一个类(还不是功能代码,只是一个涂鸦):

static ServerSocket unicorn;
public void load(){
    unicorn=new ServerSocket(39483); // whatever-port

    URLClassLoader myloader = new URLClassLoader(new URL[]{this.getClass().getResource("/META-INF/specific.jar")});
    ... // do all your unique stuff
    Runtime.addShutdownHook(new Runnable(){unicorn.close();})
}

将您的 specific.jar 放在 new.jar 中。如果尝试加载此 jar 的另一个实例,则会引发异常:套接字已在使用中。

于 2012-12-13T14:25:34.737 回答