1

好的,所以我有几个 Java 程序正在使用 linux 服务器上的 chron 作业运行。这些作业每十分钟左右运行一次,实际上需要两分钟才能运行,然后退出。我需要为程序添加一种方法来检测,当它们启动时,是否已经有一个自己在运行的实例,如果是,则退出而不进行任何进一步的操作。我真的不确定处理这个问题的最佳方法,希望有人能提供一些建议。

我考虑过的一种方法是从执行某种 PS 命令的 java 代码中运行命令行参数,并查看它们是否正在运行。尽管对于这么小的东西来说,这似乎非常挑剔和复杂。另外,我对 linux 的了解并不多,甚至不确定最好的方法。如果有人有更好的想法,请告诉我。或者,如果这是最好的方法,如果你能提供我需要的 linux 命令,我将不胜感激。谢谢。

4

3 回答 3

2

如果你有一个可写的 /tmp 目录,你可以使用一个锁文件。

当您的Java 程序启动时,在/tmp 目录中检查一个名称对您的应用程序唯一的文件(例如“my-lock-file.lock”)。如果不存在,请创建一个,并在完成后将其删除。如果存在,就退出。

您可以使用 java.io.File 类的 .exists() 方法检查文件是否存在。

如果您的代码需要可移植,您可以使用System.getProperty("java.io.tmpdir"));为您的代码运行的平台获取适当的临时目录。

于 2012-07-25T15:14:46.033 回答
0

您可以查看 JMX 和 Attach API 来查询正在运行的 JVM。

或者,正如 Andrew logvinov 提到的,通过使用锁定文件。

如果您使用的是 Java WebStart,则已经有对此的本机支持。

于 2012-07-25T15:14:45.877 回答
0

许多程序通过创建一个指向其 PID 的临时文件(通常称为“锁定”文件)来解决这个问题。文件名应该对所有相关信息进行编码,以将此进程与可以合法并行运行的其他进程区分开来。

例如,如果进程绑定到一个用户,它应该包含用户名。如果进程绑定到一台机器,它应该(也)包含主机名(如果你把它放在机器绑定的临时目录中,这是有争议的。如果你把它放在主目录中,考虑多台机器的情况通过 NFS 共享家庭)。

这些文件的位置通常是 /tmp。这是一个很好的位置,因为 /tmp 通常在系统启动期间被擦除,因此在系统崩溃的情况下不会留下孤立文件。一些程序采用的另一种解决方案是将锁定文件放在用户设置目录中,如果它与设置相关。例如,Mozilla 雷鸟有一个名为/home/<username>/.thunderbird/<profilename>.default/lock.

该文件应包含进程的 PID。这个想法很简单:如果文件包含 PID,则很容易检查该进程是否确实仍在运行。因此,如果进程崩溃,文件就会成为孤立文件。新的流程实例将检查文件中的 PID,发现它不再运行,然后忽略该文件(覆盖)。

把它们放在一起,你可以创建一个像这样的文件:

/tmp/myawesomeservice-username-hostname-lock

随着内容:

12345
于 2012-07-25T15:16:39.953 回答