Evite el mensaje "<aplicación> se cierra inesperadamente" en sigquit

18

Elimino los procesos de Python con SIGQUIT presionando a Ctrl\veces (generalmente los míos que se comportan mal). ¿Puedo evitar el mensaje "Python se cerró inesperadamente"? Sé que puedo simplemente escapar, así que no está tan mal.

"Python se cerró inesperadamente".  diálogo

Thomas
fuente
1
¿Por qué no usas control-C en su lugar? SIGTERM no causa el mensaje.
ughoavgfhw
@ughoavgfhw Estoy trabajando en un REPL que a veces pone el terminal en modo sin procesar, por lo que mi programa recibe el ctrl-c como una pulsación de tecla. También a veces tengo problemas de subprocesos, de modo que los subprocesos que deberían haber muerto no, y en Python ctrl-c parece solo matar el subproceso principal. (Sé que debería usarlos t.daemon = True, y lo estoy haciendo en su mayor parte) Por varias razones, a veces necesito usar ctrl- \.
Thomas
Si es su código, entonces es un problema de desarrollo que su código tiene que tratar con señales
user151019
@Mark estuvo de acuerdo: esto era un problema mientras que todavía no tenía ese comportamiento funcionando en ciertos casos extremos.
Thomas

Respuestas:

18

Si nunca desea ver los cuadros de diálogo de informe de bloqueo, es preferible deshabilitarlos:

defaults write com.apple.CrashReporter DialogType none

Cierre sesión y vuelva a iniciarla para aplicar los cambios.

Lri
fuente
2
Cerrar sesión no era obligatorio en mi caso.
Cory Klein
66
¿Hay alguna manera de hacer defaults write com.apple.CrashReporter DialogType noneselectivamente solo una aplicación en particular?
SexyBeast
Para mí este comportamiento no cambió (después de introducir el comando) hasta el cierre de sesión e ingrese.
r_alex_hall
12

También puede hacer que el mensaje aparezca como una notificación:

defaults write com.apple.CrashReporter UseUNC 1
Tim Baverstock
fuente
2
Como éste. En macOS Sierra, un banner de notificación se desliza en la parte superior derecha de la pantalla y desaparecerá por sí solo, pero si hace clic en él, obtendrá la ventana original de volcado por caída completa. Entonces esto es perfecto. Mucho menos molesto pero deja las opciones abiertas.
clearlight
3

El comportamiento predeterminado al recibir SIGQUIT es volcar el núcleo y salir; el reportero de fallas se activa como parte de este proceso.

Comenzando con 10.5 (?), Simplemente establecer un controlador de señal para SIGQUIT debería ser suficiente para evitar el informe de bloqueo; probablemente querrá que el controlador también llame a 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()

El código anterior se probó en 10.8.5, /usr/bin/pythonque es 2.7.2.

Chris Johnsen
fuente
1
¿Hay alguna manera de hacer defaults write com.apple.CrashReporter DialogType noneselectivamente solo una aplicación en particular?
SexyBeast