ElC*_*ine 6 java linux windows
我目前正在用 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
*/
}
Run Code Online (Sandbox Code Playgroud)
我试图找到关于这个主题的文档,但我还没有找到任何有用的东西。
非常感谢。
在 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
Run Code Online (Sandbox Code Playgroud)
这种技术也有竞争条件。
我不记得足够多的Java来说明它是否有包装器kill或文件锁定系统调用,例如 和flock,lockf以及fcntl实现此方案所需的。
| 归档时间: |
|
| 查看次数: |
8613 次 |
| 最近记录: |