好的,所以我有一些Java程序,我正在linux服务器上使用chron作业运行。这些工作每十分钟左右运行一次,需要两分钟才能运行,然后退出。我需要为程序添加一种方法来检测,当它们启动时,如果已经有一个自己运行的实例,如果是这样就退出而不再继续。我真的不确定处理这个问题的最佳方法,我希望有人可以提供一些建议。
我考虑过的一种方法是从执行某种PS命令的java代码运行一个命令行参数,然后查看它们是否正在运行。对于这么小的东西,这看起来非常挑剔和复杂。另外,我不是所有熟悉linux的人,我甚至不确定最好的方法。如果有人有更好的想法,请告诉我。或者,如果这是最好的方式,如果你能提供我需要的linux命令,我会很感激。感谢。
答案 0 :(得分:1)
答案 1 :(得分:1)
如果你有一个可写的/ tmp目录,你可以使用一个锁文件。
当您的Java程序启动时,请检查/ tmp目录中具有您的应用程序唯一名称的文件(例如“my-lock-file.lock”)。如果不存在,请创建一个,并在完成后将其删除。如果存在,只需退出。
您可以使用java.io.File类的.exists()方法检查文件是否存在。
如果您的代码需要可移植,则可以使用System.getProperty("java.io.tmpdir"));
为运行代码的平台获取适当的临时目录。
答案 2 :(得分:0)
您可以查看JMX和Attach API来查询正在运行的JVM。
或者,正如Andrew logvinov提到的那样,使用锁定文件。
如果您使用的是Java WebStart,那么已经有了原生支持。
答案 3 :(得分:0)
许多程序通过创建指向其PID的临时文件(通常称为“锁定”文件)来解决此问题。文件名应编码所有相关信息,以将此过程与可以合法并行运行的其他过程区分开来。
例如,如果进程绑定到用户,则它应包含用户名。如果进程绑定到一台机器,它应该(也)包含主机名(如果你将它放在机器绑定的temp。目录中,这是有争议的。如果你把它放在一个主目录中,想想多机器的情况通过NFS共享一个家。)
这些文件的位置通常为/ tmp。这是一个很棒的位置,因为/ tmp通常在系统启动期间被擦除,因此在系统崩溃的情况下不会留下孤立文件。某些程序使用的另一种解决方案是将锁定文件放在用户设置目录中(如果它与设置有关)。例如。 mozilla thunderbird有一个名为/home/<username>/.thunderbird/<profilename>.default/lock
的文件。
该文件应包含进程的PID。这个想法很简单:如果文件包含PID,则很容易检查此进程是否确实仍在运行。因此,如果进程崩溃,文件将变为孤立状态。新流程实例将检查文件中的PID,发现它不再运行,并忽略该文件(覆盖)。
总而言之,你可以创建一个这样的文件:
/tmp/myawesomeservice-username-hostname-lock
内容:
12345