使用JAVA中的PID验证进程是否正在运行
我目前正在JAVA中构建一个应用程序,其中只能执行一次。因此,我当前正在使用一个锁定文件,在其中写入当前执行的PID。
因此,只要此应用程序启动,它将打开文件(如果存在)并尝试检测写入文件的PID是否正在实际运行。
这样可以防止我的应用在解锁文件之前崩溃的问题。
我需要它在Windows(XP,7或8)和linux(所有用户都在基于debian的发行版)上工作。
这是一些代码,可以让您更好地了解我想做什么:
//get the PID from the fileint pidValue = new FileReader(file).read();
//get the OS type
String os = System.getProperty("os.name").toLowerCase();
//Check PID depending of OS type
if( os.contains("nux") || os.contains("nix") ){
/*
* Check PID on Linux/Unix
*/
} else if ( os.contains("win") ) {
/*
* Check PID on Windows
*/
}
我试图找到有关该主题的文档,但还没有找到有用的东西。
非常感谢你。
回答:
在posix系统上,查询pid是否正在运行的典型方法是向其发送空信号,例如kill(pid,
0)。如果调用成功,则存在该过程;如果返回ESRCH
,则不返回。这自然会遇到不可避免的种族条件,这实际上比理论上要少得多。不太统一的方法是读取/
proc文件系统(如果操作系统具有该文件系统),这会花费更多的精力,相当于同一件事,并且仍然受相同的竞争条件的影响。
请注意,pid锁定文件技术可以分为两层。也就是说,正在运行的进程将创建文件,将其锁定并写入其pid。它在运行期间保持锁定,因此这几乎不需要上面查询进程是否正在运行的原因,因为如果进程崩溃,即使文件仍然存在,文件锁也会自动释放。逻辑如下:
if file exists if can get lock
prev instance died unnaturally
continue with this new process
else
instance already running
else
good to go, continue with new process
此技术还具有比赛条件。
我不记得有足够的Java来说它是否具有包装器kill
或文件锁定系统调用(如)flock
,lockf
并且是否fcntl
需要实施此方案。
以上是 使用JAVA中的PID验证进程是否正在运行 的全部内容, 来源链接: utcz.com/qa/414525.html