当前位置: 首页 > 面试题库 >

使用JAVA中的PID验证进程是否正在运行

景靖琪
2023-03-14
问题内容

我目前正在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是否正在运行的典型方法是向其发送空信号,例如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或文件锁定系统调用(如)flocklockf并且是否fcntl需要实施此方案。



 类似资料:
  • 我已经使用了可用的OSHI库,但是getProcessID函数不起作用。我需要找到用户输入的进程的PID。

  • 问题内容: 给定Linux进程的pid,我想从C程序检查该进程是否仍在运行。 问题答案: 发出信号作为系统调用。如果调用成功,则表示存在具有此pid的进程。 如果调用失败并设置为,则不存在具有此类pid的进程。 引用POSIX标准: 如果sig为0(空信号),则执行错误检查,但实际上未发送任何信号。空信号可用于检查pid的有效性。 请注意,您在竞争条件下并不安全:目标进程可能已退出,并且与此同时已

  • 我是新来的春靴AOP。 用@Before注释的AOP方法是否在java验证注释(例如@NotNull)之前运行? 我还需要为每个请求运行一些其他自定义验证,但我需要在java验证注释运行之后运行这些验证。 哪个先跑? 我的控制器: 我的建议是:

  • 问题内容: Docker容器中有多个进程正在运行,它们的PID在容器名称空间中是隔离的,是否有办法找出Docker主机上的PID是什么? 例如,有一个Apache Web服务器在Docker容器中运行(我使用Docker Hub中的 Apache + PHP映像),而Apache在启动时会在容器内创建更多工作进程。这些工作进程实际上正在处理传入的请求。要查看这些进程,我在docker容器中运行: