【问题标题】:python-twisted and SIGKILLpython-twisted 和 SIGKILL
【发布时间】:2012-10-29 16:07:19
【问题描述】:

我有一个使用 twisted 框架的 python 应用程序。

我利用了twistd 生成的pidfile 中存储的值。启动器脚本会检查它是否存在,如果 pidfile 已经存在,则不会生成守护进程。

但是,twistd 在收到SIGKILL 信号时不会删除 .pid 文件。这使得启动器脚本认为守护程序已经在运行。

我意识到停止守护进程的正确方法是使用SIGTERM 信号,但问题是当启动守护进程的用户注销时,守护进程永远不会收到SIGTERM 信号,所以显然它被杀死了SIGKILL。这意味着一旦用户注销,他将永远无法再次启动守护进程,因为 pidfile 仍然存在。

在这种情况下,我有什么办法可以让那个文件消失吗?

【问题讨论】:

    标签: python linux twisted sigkill


    【解决方案1】:

    来自signal(2) 手册页:

    信号SIGKILLSIGSTOP 不能被捕获或忽略。

    因此,进程无法运行任何清理代码来响应该信号。通常你只使用SIGKILL 来终止一个不退出以响应SIGTERM 的进程(可以被捕获)。

    【讨论】:

    • 感谢您的回答,这似乎很合乎逻辑。然而,这让我想知道为什么 - 当用户注销时 - 没有将 SIGTERM 发送到该扭曲的守护进程,而是使用 SIGKILL?
    • @Jean-PaulCalderone:确切地说,我的 twistd 守护进程是作为 dbus 服务启动的。我读过 dbus 在关闭时会终止所有服务,但我的 twistd 守护程序会收到 SIGKILL。
    【解决方案2】:

    您可以更改您的启动器(或将其包装在另一个启动器中)并在尝试重新启动 twistd 之前删除 pid 文件。

    【讨论】:

    • 这是我目前所做的。如果文件存在,但守护进程没有响应,启动器会尝试杀死给定的 pid,然后我删除文件。但是,无法区分守护进程是正在运行(例如挂起)还是已被杀死,因为在这两种情况下,pidfile 都存在。关键是如果它被杀死了(甚至可能在之前的会话中),我不能尝试杀死那个 pid,因为它可能是一个完全其他的新进程。
    猜你喜欢
    • 2015-06-15
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2019-10-25
    • 2013-01-19
    相关资源
    最近更新 更多