【问题标题】:Writing PID File on Linux在 Linux 上编写 PID 文件
【发布时间】:2011-07-18 08:09:56
【问题描述】:

我目前正在开发一个需要单实例的 linux 守护程序(即限制为 1 个用户 1 个进程)。最好的方法是什么,而不必使用 getpid() 手动将 pid 写入 /var/run/ 然后使用 flock() 锁定它?

【问题讨论】:

  • 您不必编写 pid 文件,但必须使用某种锁定文件。
  • 写PID的好处是可以检查进程是否真的还活着,而且也很好......
  • @awoodland:不,你不能。除了进程的直接父进程之外,pid 是无用的,它可以确保在成功调用 wait-family 函数之前不会重用 pid。任何其他使用都会导致竞争条件、进程仍然存在的误报,甚至是发出错误进程信号的危险。
  • 如果你想检查进程是否还活着,你可以打开你的守护进程并锁定一个文件。当它终止时,锁将自动放弃,并且没有竞争条件。使用 unix 套接字、强大的互斥锁以及可能的其他几种类似机制也可以实现相同的目标。

标签: c linux centos daemon


【解决方案1】:

start-stop-daemon包裹启动和关闭。

【讨论】:

    【解决方案2】:

    只需锁定可执行文件本身。

    【讨论】:

    • 它不会将其限制为整个系统作为单个实例吗? IE。那么 2 个不同的用户不能在单个系统上拥有自己的实例?
    【解决方案3】:

    我在我编写的几个 initd 脚本中使用了类似的东西。用你需要的任何东西替换 COMMAND

    PIDFILE=/var/run/service.pid
    COMMAND="java -jar start.jar"
    $COMMAND > /dev/null 2>&1 &
    echo $! > $PIDFILE
    

    根据@dogane 的建议进行了编辑,也进行了测试。

    【讨论】:

    • $!会给你进程ID。你不需要 grep ps。
    • 这失败了,是一个经典的竞争条件。不能保证只有一个 COMMAND 实例会运行。
    • 诚然,这只是他问题的部分答案,它展示了如何编写 pid 文件。我将其用作启动脚本,它与实际检查进程是否已在运行的 init 脚本一起使用。如果@Error1f1f 还没有继续,我会在今晚有时间发布该代码。
    【解决方案4】:

    只需使用libunique。这是最简单的方法。

    【讨论】:

    • 这看起来很有趣,但它似乎与 GNOME 密切相关,除非我错过了什么?
    • 这取决于 GTK,而不是 Gnome。没有 GTK 很难找到 Linux 桌面。但是,如果您要在无头服务器上使用您的守护进程,libunique 不是最佳选择。
    【解决方案5】:

    如果您确实无法拥有锁定文件,请改用套接字。另一个实例将无法启动,因为该地址已在使用中。

    【讨论】:

    • 我想你的意思是绑定一个套接字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    相关资源
    最近更新 更多