如何诊断Ctrl + C为什么不停止保留

时间:2018-10-15 23:52:44

标签: python signals pyramid

我正在尝试将项目从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())

1 个答案:

答案 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开发工作,从而使它暴露出来。