【发布时间】:2018-10-19 00:46:09
【问题描述】:
我正在尝试将一个项目从 Cherrypy 移植到 Pyramid Web 框架。我已经转换了一小部分,并注意到 Ctrl+C 不会停止 Pyramid 应用程序。 cookiecutter 版本将使用 Ctrl+C 停止。我最终每次都需要终止该进程。
我正在使用 pserve 命令提供服务,在这两种情况下都使用 waitress WSGI 服务器...
保留 development.ini
我还要注意:我在 VirtualBox VM 中运行 Debian Stretch。
有没有办法知道行为改变的原因或如何恢复 Ctrl+C 关机?我怎么知道现在是否有什么东西阻止了这种情况的发生?
-- cmets 中要求的附加信息--
使用 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())
【问题讨论】:
-
我不熟悉你正在处理的项目,但我知道有两种方法可以捕捉 Ctrl+C are outlined here。
-
谢谢你,但我真的更感兴趣的是如何知道是什么阻止了默认情况下似乎工作的东西,如何追踪它(也许是 GDB?)或如何知道它的原因放弃工作...
-
Ctrl+C 信号传递比一般信号更复杂,涉及终端和进程组。当您下次有机会终止该进程时,您可以尝试
kill -2 processid并让我们知道这是否有效? -
您能否运行
grep Sig /proc/processid/status并查看每行中的最后一个十六进制数字,并告诉我们其中任何一个中的第二低位是否打开?这将显示 SIGINT 是否被捕获或忽略或其他原因。 -
好的,它表明该进程有一个用于 SIGINT 的信号处理程序。这个过程是你有源代码的吗?如果您不确定,请使用
gdb附加到它,并使用bt进行回溯,看看是否有什么熟悉的地方。