【发布时间】:2012-09-01 08:34:37
【问题描述】:
上下文:
我有一个 linux[1] 系统,它管理着一系列第三方守护进程,它们的交互仅限于 shell[2] 初始化脚本,即只有 {start|restart|stop|status} 可用。
问题:
进程可以假定先前运行的进程的 PID,进程的状态通过使用它的 PID 检查是否存在正在运行的进程来检查。
示例:
进程 A 使用 PID 123 运行,随后死亡,进程 B 使用 PID 123 进行初始化,并且状态命令以不真实(错误)的“OK”响应。换句话说,我们只从它的 PID 中检查一个进程是否存在,以验证该进程是否正在运行,我们假设如果存在具有该 PID 的进程,它就是有问题的进程。
建议的解决方案:
- 使用 PID 询问进程,以确保命令/守护程序按照预期的 PID 运行。这个方案的问题是命令和PID都需要匹配;因此需要维护和保持多位信息同步,并增加错误/边缘条件的复杂性。
- 将 PID 文件的创建时间与进程的启动时间相关联,如果进程在 PID 文件创建时间的某个增量内,我们可以相当确定命令/守护程序运行是否符合预期。
除了存在使用该 PID 运行的进程之外,是否有一种标准方法来批准进程/PID 文件的真实性? IE。我(作为系统)想知道你(进程)是否正在运行,以及你是否是我认为的你(A 而不是 B)。
假设我们选择实施上面提出的第二种解决方案,PID 创建时间和进程启动时间之间的置信区间/增量是多少是合理的?在这里,合理的意思是类型 1/类型 2 错误之间可接受的折衷。
[1] CentOS/RHEL [2] 重击
【问题讨论】:
-
不应该在ServerFault上吗?
-
您可以对第三方守护进程本身进行任何更改吗?如果是这样,您可以使用
flock为守护进程创建一些文件系统锁。 -
您确定进程 ID 会被立即重用吗?我知道在 Windows 上就是这种情况,但在 Linux 或 UNIX 上我没有观察到。见stackoverflow.com/questions/3446727/…
-
@cdarke 永远不会有相同 PID 的多个实例,问题是一旦进程死亡,它的 PID 可能会被重用。此时,由于异常情况杀死进程而成为孤立的PID文件的存在,用于确定进程是否仍在运行。在这里,一切看起来都很好(进程正在运行),但实际上并不是我们希望找到的进程。
-
@Gary:是的,但我的意思是 PID 不会立即重用(Windows 除外)。如果没有整理操作,则可能会从先前的运行中留下旧的 PID 文件。显然使用 PID 文件来确定进程是否仍在运行是有缺陷的设计。
标签: linux bash shell process pid