gpt4 book ai didi

python - 如何诊断 Ctrl + C 不停止 pserve 的原因

转载 作者:行者123 更新时间:2023-12-01 08:55:02 24 4
gpt4 key购买 nike

我正在尝试将项目从 Cherrypy 移植到 Pyramid Web 框架。我转换了一小部分,并注意到 Ctrl+C 不会停止 Pyramid 应用程序。 cookiecutter 版本将通过 Ctrl+C 停止。我最终每次都需要终止该进程。

我正在使用 pserve 命令提供服务,该命令在这两种情况下都使用 waitress WSGI 服务器...

pserve development.ini

我还应该注意:我正在 VirtualBox VM 中运行 Debian Stretch。

有没有办法知道行为发生变化的原因或如何恢复 Ctrl+C 关闭?我怎么知道现在是否有什么东西阻止了这种情况的发生?

-- 评论中要求提供的其他信息 --

使用 grep Sig/proc/process_id/status 会产生以下结果:

SigQ:   0/15735
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000001001000
SigCgt: 0000000180004002 hex/binary 110000000000000000100000000000010

使用 GDB 并获取 py-bt

    (gdb) py-bt
Traceback (most recent call first):
<built-in method select of module object at remote 0x7f914f837e58>
File "/usr/lib/python3.5/asyncore.py", line 144, in poll
r, w, e = select.select(r, w, e, timeout)
File "/usr/lib/python3.5/asyncore.py", line 203, in loop
poll_fun(timeout, map)
File "/home/clutton/programs/python/webapps_pyramid/env/lib/python3.5/site-packages/waitress/server.py", line 131, in run
use_poll=self.adj.asyncore_use_poll,
File "/home/clutton/programs/python/webapps_pyramid/env/lib/python3.5/site-packages/waitress/__init__.py", line 17, in serve
server.run()
File "/home/clutton/programs/python/webapps_pyramid/env/lib/python3.5/site-packages/waitress/__init__.py", line 20, in serve_paste
serve(app, **kw)
File "/home/clutton/programs/python/webapps_pyramid/env/lib/python3.5/site-packages/paste/deploy/util.py", line 55, in fix_call
val = callable(*args, **kw)
File "/home/clutton/programs/python/webapps_pyramid/env/lib/python3.5/site-packages/paste/deploy/loadwsgi.py", line 189, in server_wrapper
**context.local_conf)
File "/home/clutton/programs/python/webapps_pyramid/env/lib/python3.5/site-packages/pyramid/scripts/pserve.py", line 239, in run
server(app)
File "/home/clutton/programs/python/webapps_pyramid/env/lib/python3.5/site-packages/pyramid/scripts/pserve.py", line 32, in main
return command.run()
File "/home/clutton/programs/python/webapps_pyramid/env/bin/pserve", line 11, in <module>
sys.exit(main())

最佳答案

为了诊断我在哪里遇到问题,我在针对该问题的许多评论的指导下采取了以下步骤。

我检查了该过程以确保信号确实被捕获。

grep Sig /proc/process_id/status

这会产生以下信息:

SigQ:   0/15735  
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000001001000
SigCgt: 0000000180004002 hex/binary 110000000000000000100000000000010

SigCgt 表示确实正在监听的信号,在上面,转换为二进制的十六进制值表明(从右到左)信号 2 和 15 确实被绑定(bind)。

此时我们需要诊断为什么会有一个处理程序但它似乎无法工作。所以剩下的问题是处理程序是什么。为了找到这一点,我使用了 Python 信号模块并添加了一些代码,我可以在调试器中看到它......

import signal
s = signal.getsignal(2)

完成此操作后,我发现处理程序引用了项目一部分的独立脚本中的函数。我正在覆盖默认信号处理程序,以便在终止进程之前进行清理,但是......我也在这个拥有自己进程的项目的一部分中导入了它。由于该项目通常是在 Windows 上开发的,我之前使用 Ctrl-C 时可能会处理不同的信号,因此这个错误已经存在很长时间了,并且为该项目做了一些 Linux 开发工作才发现了它。

关于python - 如何诊断 Ctrl + C 不停止 pserve 的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52826185/

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