Prevenire il messaggio "<application> si è chiuso inaspettatamente" su sigquit


18

Uccido i processi Python con SIGQUIT premendo a Ctrl\volte (di solito i miei si comportano male). Posso impedire il messaggio "Python si è chiuso improvvisamente"? So di poter semplicemente scappare, quindi non è poi così male.

"Python si è chiuso inaspettatamente."  dialogo


1
Perché invece non usi control-C? SIGTERM non causa il messaggio.
ughoavgfhw,

@ughoavgfhw Sto lavorando su un REPL che a volte mette il terminale in modalità raw, quindi il mio programma riceve invece il tasto ctrl-c come una sequenza di tasti. Inoltre a volte ho problemi con i thread, in modo che i thread che avrebbero dovuto morire non lo facciano, e in Python ctrl-c sembra solo uccidere il thread principale. (So ​​che dovrei usare t.daemon = Truequesti, e lo sono per la maggior parte) Per vari motivi, a volte ho bisogno di usare ctrl- \.
Thomas,

Se è il tuo codice, allora un problema di sviluppo che il tuo codice deve affrontare con i segnali
user151019

@Mark Concordato: questo era un problema mentre non avevo ancora quel comportamento funzionante in alcuni casi limite.
Thomas,

Risposte:


18

Se non vuoi mai vedere le finestre di dialogo del crash report, c'è una preferenza per disabilitarle:

defaults write com.apple.CrashReporter DialogType none

Disconnettersi e accedere nuovamente per applicare le modifiche.


2
La disconnessione non è stata richiesta nel mio caso.
Cory Klein,

6
C'è un modo per fare defaults write com.apple.CrashReporter DialogType noneselettivamente una sola app?
SexyBeast,

Per me questo comportamento non è cambiato (dopo aver inserito il comando) fino al logout e al login.
r_alex_hall

12

Puoi anche far apparire il messaggio come una notifica:

defaults write com.apple.CrashReporter UseUNC 1

2
Come questo. Su macOS Sierra un banner di notifica scorre in alto a destra sullo schermo e scompare da solo, ma se fai clic su di esso otterrai la finestra di dump di arresto anomalo completo originale. Quindi questo è perfetto. Molto meno invadente ma lascia aperte le opzioni.
chiarimento

3

Il comportamento predefinito quando si riceve SIGQUIT è scaricare il core ed uscire; il reporter di crash viene attivato come parte di questo processo.

Iniziare con 10.5 (?) Semplicemente impostando un gestore di segnale per SIGQUIT dovrebbe essere sufficiente per evitare il reporter di crash; probabilmente vorrai che il gestore chiami anche 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()

Il codice sopra è stato testato il 10.8.5 contro il /usr/bin/pythonquale è 2.7.2.


1
C'è un modo per fare defaults write com.apple.CrashReporter DialogType noneselettivamente una sola app?
SexyBeast,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.