【问题标题】:Paster daemon won't shut down because can't read own pid filePaster 守护进程不会关闭,因为无法读取自己的 pid 文件
【发布时间】:2011-06-24 04:30:19
【问题描述】:

TL;DR 版本:当我要求 Paster 停止守护进程时,它无法读取用于跟踪其进程 ID 的自己的文件。

加长版

我在 Windows Vista 上的 Python 2.7.1 上运行 Paster(粘贴脚本 1.7.3)。

我的第一个惊喜来自于运行一个简单的网站:

>paster serve development.ini
Starting server in PID 15184.
serving on http://127.0.0.1:5000

我希望在同一目录中找到 paste.pid 文件,但我没有。奇怪的。没关系,让我们通过终止该进程并重新开始来明确说明。

>paster serve development.ini --pid-file=my.pid
Starting server in PID 20884.
serving on http://127.0.0.1:5000

这一次,它创建了一个名为 my.pid 的文件。在另一个命令窗口中,我可以输入:

 >type my.pid
 20884

网站服务成功,任务管理器确认有一个 Python 进程在运行,PID 为 20884。

现在,让 Paster 报告守护进程的状态:

>paster serve development.ini --status --pid-file=my.pid
PID None in my.pid is not running

>type my.pid
20884

奇怪。它声称 my.pid 中的 PID 是 None,但实际上不是。

让我们关闭它。

>paster serve --stop-daemon --pid-file=my.pid
PID in my.pid is not valid (deleting)

>type my.pid
The system cannot find the file specified.

所以,它尝试读取 my.pid,无法读取,无奈删除。

与此同时,守护进程继续运行。

我必须手动杀死 paste 守护程序,这是@Lennart Regebro 在similar, less detailed question 中推荐的。 作为测试的一部分,我想将其自动化,因此我希望找到一个更简洁的解决方案。

有什么建议吗?

【问题讨论】:

    标签: python windows daemon paster


    【解决方案1】:

    来自粘贴脚本的源代码(serve.py),在PID读取方法中:

    pid = read_pidfile(pidfile)
    if pid:
        try:
            os.kill(int(pid), 0)
            return pid
        except OSError, e:
            if e.errno == errno.EPERM:
                return pid
    return None
    

    在与 POSIX 兼容的平台上,将 0 指定为信号 just checks whether the process is alive

    但是,在 Windows 上,没有kill 系统调用; Python will use TerminateProcess 代替。从粘贴脚本中删除 os.kill 行或使用与 POSIX 兼容的平台,例如 Cygwin(Windows 之上的 POSIX 层)或 Linux。

    【讨论】:

    • 总结以确保我清楚: os.kill(pid, 0) 不会杀死 POSIX 平台上的进程,但会在 Windows 上使用的 TerminateProcess shiv 上(从 Python 2.7 开始,即可能是为什么它没有被 Paster 1.7.3 修复)。呃,这是一个尴尬的情况。
    • @Oddthinking 完全正确。 kill 这个名字有误导性,它实际上只是发送一个信号。然而,大多数信号恰好与中断/终止进程有关。
    猜你喜欢
    • 1970-01-01
    • 2015-10-11
    • 2016-10-01
    • 2013-06-17
    • 1970-01-01
    • 2014-10-20
    • 2014-08-30
    • 2016-05-08
    • 2018-03-10
    相关资源
    最近更新 更多