【问题标题】:PID files hanging around for daemons after server restart服务器重新启动后为守护进程挂起的 PID 文件
【发布时间】:2011-01-09 05:39:01
【问题描述】:

我有一些使用 PID 文件来阻止我的程序并行执行的守护进程。我已经设置了一个信号处理程序来捕获 SIGTERM 并进行必要的清理,包括 PID 文件。当我使用“kill -s SIGTERM #PID”进行测试时,这非常有用。但是,当我重新启动服务器时,PID 文件仍然存在,阻止了守护程序的启动。据我了解,当服务器关闭时,SIGTERM 会发送到所有进程。我是否应该在我的守护进程中捕获另一个信号(SIGINT、SIGQUIT?)?

【问题讨论】:

    标签: python linux sigterm


    【解决方案1】:

    在你的pidfile上使用flock(或lockf),如果成功,你可以重写pidfile并继续。

    This SO answer 有一个很好的例子来说明如何做到这一点。

    【讨论】:

      【解决方案2】:

      请记住,在向所有进程发送 SIGTERM 之后,内核会等待一段时间(通常大约 2 或 3 秒),然后再发送 SIGKILL。你可以在 /etc/rc.d/rc0.d/S01halt 或类似的地方找到它(可能会因你的发行版而异)。

      例如,在我的 Fedora 11 上,您有:

      action $"Sending all processes the TERM signal..." /sbin/killall5 -15
      sleep 2
      action $"Sending all processes the KILL signal..."  /sbin/killall5 -9
      

      所以如果你不够快,要么增加延迟,要么确保你更快!

      【讨论】:

        【解决方案3】:

        不是直接的解决方案,但最好在启动时检查 pid 文件中的 pid 运行的实际进程,如果不存在,则清理陈旧文件。

        您的进程可能在有机会清理 pid 文件之前就收到了 SIGKILL。

        【讨论】:

        • +1:掉电时,不会给任何进程发送任何信号,你会得到同样的“PID文件没有匹配的进程”。明确指出了比简单地查找 PID 文件更好的测试。
        • 如果 pid 被另一个进程使用,你的守护进程会认为它已经在运行,所以不能保证。
        • 臭烟斗。您始终可以检查具有 pid 的进程的名称并仔细检查。这是一个微不足道的障碍。
        猜你喜欢
        • 2012-09-30
        • 2011-06-24
        • 2011-06-21
        • 2013-01-09
        • 1970-01-01
        • 2018-08-16
        • 2018-04-25
        • 2013-06-17
        • 1970-01-01
        相关资源
        最近更新 更多