【发布时间】:2011-07-09 13:15:13
【问题描述】:
是否有一种简单的方法可以确定某个进程是否正在运行? 我需要知道我的程序的实例是否在后台运行,如果没有,则 fork 并创建后台进程。
【问题讨论】:
标签: c linux operating-system process
是否有一种简单的方法可以确定某个进程是否正在运行? 我需要知道我的程序的实例是否在后台运行,如果没有,则 fork 并创建后台进程。
【问题讨论】:
标签: c linux operating-system process
Linux 软件,到目前为止,不关心程序的排他性,只关心它们使用的资源。 “关怀”通常由实现提供(例如发行版的基础架构)。
例如,如果您想运行一个程序,但该程序锁定或变成僵尸,而您无法杀死它,或者它正在以不同的用户身份运行,执行某些其他功能。为什么程序要关心自己的另一个副本是否正在运行?这样做似乎只是一种不必要的限制。
如果是打开套接字的进程(如 TCP 端口),如果无法打开套接字,则程序会失败。如果它需要对文件的独占访问权,如果无法获得它就让它失败。支持 PID 文件,但不要强制。
您会在整个 GNU 软件中看到这种方法,这是使它如此通用的部分原因。
【讨论】:
通常这样做的无种族方式是:
与简单地存储 PID 相比,这样做的好处是,如果有人重复使用 PID,您将不会得到误报。
将 pid 存储在文件中的最大问题是系统启动守护程序使用的低编号 pid 可以在随后的重新启动时被不同的守护程序重用。我已经看到了这种情况。
【讨论】:
这通常使用 pidfiles 完成:/var/run/[name].pid 中的一个文件,仅包含 fork() 返回的进程 ID。
如果 pidfile 存在: 出口() 别的: 创建 pidfile pid = start_background() pidfile.write(pid) 关机时:删除 pidfile【讨论】:
if pidfile exists 也会触发旧的陈旧 pid 文件。您可能还想检查 pid 文件的内容并至少验证进程是否处于活动状态,可能还需要检查进程的名称。