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

2024-04-29 09:35:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在试验将一个项目从Cherrypy移植到PyramidWeb框架。我转换了一小部分,注意Ctrl+C不会停止金字塔应用程序。cookiecutter版本将使用Ctrl+C停止。我每次都需要终止进程。你知道吗

我使用pserve命令服务,在这两种情况下都使用waitress WSGI服务器。。。你知道吗

pserve development.ini

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

有没有办法知道为什么行为发生了变化,或者如何恢复Ctrl+C关闭?我怎么知道是不是有什么东西阻止了这一切的发生?你知道吗

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

使用grep Sig/proc/process\u 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())

Tags: inpyenvpyramidhomelibpackagesline
1条回答
网友
1楼 · 发布于 2024-04-29 09:35:17

为了诊断我在哪里遇到了问题,我采取了以下步骤,这些步骤是在对这个问题的许多评论的指导下进行的。你知道吗

我检查了整个过程,以确保信号确实被捕捉到。你知道吗

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时可能会处理不同的信号,所以这个bug已经存在了很长时间,并且为这个项目做了一些Linux开发工作,使它曝光了。你知道吗

相关问题 更多 >