gpt4 book ai didi

python - Paster 守护进程不会关闭,因为无法读取自己的 pid 文件

转载 作者:可可西里 更新时间:2023-11-01 09:31:17 24 4
gpt4 key购买 nike

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

我希望在同一目录中找到一个 paster.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,读取不到,无奈删除。

同时守护进程继续运行。

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

有什么建议吗?

最佳答案

来自粘贴脚本的源代码(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。

关于python - Paster 守护进程不会关闭,因为无法读取自己的 pid 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6463388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com