Запретить сообщение «<application> неожиданно завершить» при sigquit


18

Я убиваю процессы Python с помощью SIGQUIT, нажимая Ctrl\иногда (обычно мои собственные, которые плохо себя ведут). Могу ли я предотвратить сообщение «Python неожиданно завершил работу»? Я знаю, что могу просто сбежать, так что все не так плохо.

"Python неожиданно завершился."  диалог


1
Почему бы вам не использовать вместо этого control-C? SIGTERM не вызывает сообщение.
ughoavgfhw

@ughoavgfhw Я работаю над REPL, который иногда переводит терминал в сырой режим, поэтому моя программа вместо этого получает нажатие клавиши ctrl-c. Также иногда у меня возникают проблемы с потоками, например, потоки, которые должны быть умирают, не работают, а в Python ctrl-c, кажется, только убивает основной поток. (Я знаю, что я должен использовать t.daemon = Trueих, и я по большей части) По разным причинам иногда мне нужно использовать ctrl- \.
Томас

Если это ваш код, то проблема разработки вашего кода
связана

@ Марк согласен - это была проблема, хотя у меня еще не было такого поведения, работающего в определенных крайних случаях.
Томас

Ответы:


18

Если вы никогда не хотите видеть диалоги отчетов о сбоях, есть предпочтение отключить их:

defaults write com.apple.CrashReporter DialogType none

Выйдите и снова войдите, чтобы применить изменения.


2
Выйти не требовалось в моем случае.
Кори Кляйн

6
Есть ли способ сделать defaults write com.apple.CrashReporter DialogType noneвыборочно только для одного конкретного приложения?
SexyBeast

Для меня это поведение не изменилось (после ввода команды) до выхода из системы и входа в
нее

12

Вы также можете сделать сообщение в виде уведомления:

defaults write com.apple.CrashReporter UseUNC 1

2
Как этот. В macOS Sierra баннер уведомлений скользит в правом верхнем углу экрана и исчезает сам по себе, но если вы щелкнете по нему, вы получите исходное окно полного аварийного дампа. Так что это прекрасно. Намного менее навязчиво, но оставляет варианты открытыми.
ясный свет

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/python2.7.2.


1
Есть ли способ сделать defaults write com.apple.CrashReporter DialogType noneвыборочно только для одного конкретного приложения?
SexyBeast
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.