【问题标题】:Determine if a process is running?确定一个进程是否正在运行?
【发布时间】:2011-07-09 13:15:13
【问题描述】:

是否有一种简单的方法可以确定某个进程是否正在运行? 我需要知道我的程序的实例是否在后台运行,如果没有,则 fork 并创建后台进程。

【问题讨论】:

    标签: c linux operating-system process


    【解决方案1】:

    Linux 软件,到目前为止,不关心程序的排他性,只关心它们使用的资源。 “关怀”通常由实现提供(例如发行版的基础架构)。

    例如,如果您想运行一个程序,但该程序锁定或变成僵尸,而您无法杀死它,或者它正在以不同的用户身份运行,执行某些其他功能。为什么程序要关心自己的另一个副本是否正在运行?这样做似乎只是一种不必要的限制。

    如果是打开套接字的进程(如 TCP 端口),如果无法打开套接字,则程序会失败。如果它需要对文件的独占访问权,如果无法获得它就让它失败。支持 PID 文件,但不要强制。

    您会在整个 GNU 软件中看到这种方法,这是使它如此通用的部分原因。

    【讨论】:

      【解决方案2】:

      通常这样做的无种族方式是:

      • 打开一个锁定文件/pid文件进行写入(但不要截断它)
      • 尝试在不阻塞的情况下对其进行排他锁(使用 fcntl 或flock)
      • 如果 EAGAIN 失败,则其他进程已在运行。
      • 文件描述符现在应该由守护程序继承并在其生命周期内保持打开状态

      与简单地存储 PID 相比,这样做的好处是,如果有人重复使用 PID,您将不会得到误报。

      将 pid 存储在文件中的最大问题是系统启动守护程序使用的低编号 pid 可以在随后的重新启动时被不同的守护程序重用。我已经看到了这种情况。

      【讨论】:

        【解决方案3】:

        这通常使用 pidfiles 完成:/var/run/[name].pid 中的一个文件,仅包含 fork() 返回的进程 ID。

        如果 pidfile 存在: 出口() 别的: 创建 pidfile pid = start_background() pidfile.write(pid) 关机时:删除 pidfile

        【讨论】:

        • 我在那个文件夹中没有看到很多 pid 文件,很多都丢失了。还有别的地方吗?
        • 根据FHS 应该将系统 pidfile 放置在其中。如果您正在编写用户级程序,您可以将 pidfile 放在用户的主目录 (~/.[name]/[name].pid) 中。
        • 很可能——在标准 C I/O 中很少定义为原子的,因此很难避免。在产生后台进程并保护清理之前创建 pidfile,我认为风险应该可以忽略不计。
        • 请注意,if pidfile exists 也会触发旧的陈旧 pid 文件。您可能还想检查 pid 文件的内容并至少验证进程是否处于活动状态,可能还需要检查进程的名称。
        猜你喜欢
        • 1970-01-01
        • 2010-12-08
        • 2012-02-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2015-06-10
        • 1970-01-01
        • 2014-05-27
        相关资源
        最近更新 更多