3

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

更长的版本

我在 Windows Vista 上的 Python 2.7.1 上运行 Paster (pastescript 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

该网站已成功提供服务,并且任务管理器确认有一个使用 PID 20884 运行的 python 进程。

现在,让我们让 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 在一个类似的、不太详细的问题中推荐的。作为测试的一部分,我想将其自动化,所以我希望找到一个更清洁的解决方案。

有什么建议么?

4

1 回答 1

2

从粘贴脚本的源代码(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 指定为信号只是检查进程是否处于活动状态

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

于 2011-06-24T09:03:23.627 回答