在 Unix 环境中检测过时的 pid 文件

问题描述 投票:0回答:2

在 Unix 环境中检测过时的 pid 文件的标准、跨平台方法是什么?假设我想终止应用程序的旧实例,但如果该应用程序已经退出,我当然不想破坏具有相同 PID 的不相关进程。

现在我找到了一种在我的 Ubuntu(因此可能是其他基于 GNU/Linux 的系统)上执行此操作的方法 - 伪代码如下:

if ( mtime(pid_file) < mtime( "/proc/"+pid ) ) {
     /* process started AFTER the file creation */
     /* so it's not what we're looking for */
     unlink(pid_file);
     return 0;
};
/* proceed to kill & do all stuff */

但是这样的 hack 可以在其他系统上工作吗?无论如何,这应该是一项标准任务,其解决方案已有 30 多年的历史。

发现类似的问题here,但未能找到我的问题的明确答案。

谢谢你。

unix language-agnostic pid
2个回答
3
投票

/proc/ 中的文件时间可追溯到 至少 1991 年;见第14页。 243. 而且,尽管 mtime 可以被伪造(例如通过

touch -m --date=<needed_date> <target_file>
),但对于用户态应用程序来说,无法在其自己的 /proc/ 条目上做到这一点。


0
投票

即使在 Linux 上,这种方法也不是 100% 可靠,因为 /proc 条目创建显然存在竞争条件。

Ubuntu 20 系统的输出示例:

# bash -c 'echo $$ > pidfile; ls -ld --full-time pidfile /proc/$$'
-rw-r--r-- 1 root root 7 2024-03-07 03:15:28.888043061 +0000 pidfile
dr-xr-xr-x 9 root root 0 2024-03-07 03:15:28.892043050 +0000 /proc/719367

正如您在此处看到的,/proc 条目显示为比 pidfile 更新。因此,该过程“在”文件创建之后“开始”,但它绝对是您正在寻找的那个。

您可能可以添加一些捏造的数字来解决这个问题,但您最好决定要犯的错误方向:有一些误报,或一些误报。

© www.soinside.com 2019 - 2024. All rights reserved.