防止sigquit上出现“ <application>意外退出”消息


18

Ctrl\有时会按下SIGQUIT来杀死Python进程(通常是我自己的行为异常)。我可以防止“ Python意外退出”消息吗?我知道我可以逃脱,所以还不错。

“ Python意外退出。”  对话


1
您为什么不使用control-C呢?SIGTERM不会导致该消息。
ughoavgfhw

@ughoavgfhw我正在使用REPL,有时会将终端置于原始模式,所以我的程序改为接收ctrl-c作为按键。有时我还会遇到线程问题,例如那些本该死的线程不会,并且在Python中ctrl-c似乎只会杀死主线程。(我知道我应该t.daemon = True在这些上使用,并且大部分时间都在使用)由于种种原因,有时我需要使用ctrl- \。
托马斯

如果这是您的代码,那么开发问题中的代码就必须处理信号
2014年

@Mark Agreed-这是一个问题,尽管在某些情况下我还没有这种行为。
托马斯

Answers:


18

如果您永远不想看到崩溃报告对话框,则可以选择禁用它们:

defaults write com.apple.CrashReporter DialogType none

注销并重新登录以应用更改。


2
在我的情况下,无需注销。
科里·克莱恩

6
有没有一种方法可以defaults write com.apple.CrashReporter DialogType none仅针对一个特定应用选择性地进行选择?
SexyBeast

对我来说,这种行为直到注销并登录后才改变(输入命令后)
。– r_alex_hall

12

您还可以使消息显示为通知:

defaults write com.apple.CrashReporter UseUNC 1

2
像这个。在macOS Sierra上,通知横幅会在屏幕右上方滑动,并且会自行消失,但是如果单击它,您将获得原始的完整崩溃转储窗口。因此,这是完美的。不太引人注目,但保留了选择权。
clearlight '17

3

收到SIGQUIT时的默认行为是转储核心并退出;崩溃报告程序是此过程的一部分。

从10.5(?)开始,只需为SIGQUIT设置信号处理程序就足以避免崩溃报告程序;您可能希望处理程序也调用exit。

import signal, sys, os

def sigquit_handler(signum, frame):
    print 'SIGQUIT received; exiting'
    sys.exit(os.EX_SOFTWARE)

signal.signal(signal.SIGQUIT, sigquit_handler)

# Do your normal work instead of this
print 'Waiting for a signal...'
signal.pause()

上面的代码在10.8.5上进行了测试,/usr/bin/python相对于2.7.2。


1
有没有一种方法可以defaults write com.apple.CrashReporter DialogType none仅针对一个特定应用选择性地进行选择?
SexyBeast
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.