我目前正在JAVA中构建一个只能执行一次的应用程序.所以我目前正在使用一个锁文件,我在其中写入当前执行的PID.
因此,每当此应用程序启动时,它将打开文件(如果存在)并尝试检测文件中写入的PID是否实际正在运行.
这可以防止在解锁文件之前我的应用程序崩溃的问题.
我需要这个在Windows(XP,7或8)和Linux(所有用户都在基于debian的发行版)上工作.
//get the PID from the file
int 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是否正在运行的典型方法是向其发送空信号,例如杀(pid,0).如果呼叫成功,则该过程存在;如果它返回ESRCH则不会.这自然会受到不可避免的竞争条件的影响,实际上比实际情况要少得多.不太统一的方法是读取/ proc文件系统(如果操作系统有一个),这是更多的工作,相同的事情,并仍然受到相同的竞争条件.
请注意,pid lockfile技术可以是双层的.也就是说,正在运行的进程会创建文件,锁定它并写入其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)的包装器.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。