我正在尝试将项目从Cherrypy移植到Pyramid Web框架。我有一小部分已转换,请注意Ctrl + C不会停止Pyramid应用程序。 Cookiecutter版本将以Ctrl + C停止。我最终每次都需要终止该进程。
我正在使用在两种情况下都使用女服务员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())
答案 0 :(得分:1)
为了诊断出我在哪里遇到问题,我在针对该问题的许多评论中采取了以下步骤。
我检查了过程以确保确实捕获到信号。
grep Sig /proc/process_id/status
会产生以下信息:
SigQ: 0/15735
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000001001000
SigCgt: 0000000180004002 hex/binary 110000000000000000100000000000010
SigCgt指示确实正在监听的信号,在上面的十六进制值转换为二进制值表示(从右到左)信号2和15确实已绑定。
在这一点上,我们需要诊断为什么会有一个处理程序,但是它似乎无法正常工作。所以剩下的问题是什么是处理程序。为了找到答案,我使用了Python信号模块,并在调试器中添加了一些可以在其中看到的代码...
import signal
s = signal.getsignal(2)
一旦我这样做,我发现处理程序从一个独立脚本中引用了一个函数,该脚本是项目的一部分。我正在覆盖默认的信号处理程序,以便在终止过程之前进行清理,但是...我也在具有自己过程的项目的一部分中导入了它。由于该项目通常是在Windows上开发的,因此以前使用Ctrl-C时我可能会处理不同的信号,因此此错误已经存在很长时间了,并且对该项目进行了一些Linux开发工作,从而使它暴露出来。