我目前正在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
或文件锁定系统调用(如)flock
,lockf
并且是否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容器中运行: