Impedir a mensagem "<application> encerre inesperadamente" no sigquit

18

Eu mato processos Python com SIGQUIT pressionando Ctrl\algumas vezes (geralmente os meus que estão se comportando mal). Posso impedir a mensagem "Python sair inesperadamente"? Eu sei que posso simplesmente escapar, então não é tão ruim.

"O Python saiu inesperadamente."  diálogo

Thomas
fonte
1
Por que você não usa control-C? SIGTERM não causa a mensagem.
precisa saber é o seguinte
@ughoavgfhw Estou trabalhando em um REPL que às vezes coloca o terminal no modo bruto, então meu programa recebe o ctrl-c como pressionamento de tecla. Às vezes, também tenho problemas de encadeamento, de modo que encadeamentos que deveriam morrer não, e no Python o ctrl-c parece apenas matar o encadeamento principal. (Eu sei que devo usá t.daemon = True-las e, na maioria das vezes, sou). Por várias razões, às vezes preciso usar ctrl- \.
Thomas
Se for o seu código, um problema de desenvolvimento deve ser feito com sinais
user151019
@ Mark Concordou - este era um problema, enquanto eu ainda não tinha esse comportamento trabalhando em certos casos extremos.
Thomas

Respostas:

18

Se você nunca quiser ver as caixas de diálogo do relatório de falha, há uma preferência para desativá-las:

defaults write com.apple.CrashReporter DialogType none

Saia e faça login novamente para aplicar as alterações.

Lri
fonte
2
Não foi necessário fazer logout no meu caso.
Cory Klein
6
Existe uma maneira de fazer defaults write com.apple.CrashReporter DialogType noneseletivamente apenas um aplicativo em particular?
Sexy Beast
Para mim, este comportamento não se alterou (depois de entrar o comando) até o logout e login.
r_alex_hall
12

Você também pode fazer a mensagem aparecer como uma notificação:

defaults write com.apple.CrashReporter UseUNC 1
Tim Baverstock
fonte
2
Como este. No macOS Sierra, um banner de notificação desliza no canto superior direito da tela e desaparece por si só, mas se você clicar nele, obtém a janela completa original do despejo de memória. Então isso é perfeito. Muito menos invasivo, mas deixa as opções em aberto.
Clearlight
3

O comportamento padrão ao receber SIGQUIT é despejar o núcleo e sair; o repórter de falha é acionado como parte desse processo.

Começando com 10.5 (?), Simplesmente definir um manipulador de sinal para SIGQUIT deve ser suficiente para evitar o repórter; você provavelmente desejará que o manipulador também chame 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()

O código acima foi testado em 10.8.5 contra o /usr/bin/pythonqual é 2.7.2.

Chris Johnsen
fonte
1
Existe uma maneira de fazer defaults write com.apple.CrashReporter DialogType noneseletivamente apenas um aplicativo em particular?
Sexy Beast