Empêcher le message «<application> se ferme de façon inattendue» sur sigquit

18

Je tue les processus Python avec SIGQUIT en appuyant Ctrl\parfois (généralement les miens qui se comportent mal). Puis-je empêcher le message "Python se fermer de façon inattendue"? Je sais que je peux juste m'échapper, donc ce n'est pas si mal.

"Python s'est arrêté de façon inattendue."  dialogue

Thomas
la source
1
Pourquoi n'utilisez-vous pas control-C à la place? SIGTERM ne provoque pas le message.
ughoavgfhw
@ughoavgfhw Je travaille sur un REPL qui met parfois le terminal en mode brut, donc mon programme reçoit le ctrl-c comme une touche à la place. Parfois aussi, j'ai des problèmes de threads, tels que les threads qui devraient avoir ne le font pas, et en Python, ctrl-c semble ne tuer que le thread principal. (Je sais que je devrais les utiliser t.daemon = True, et je le suis pour la plupart) Pour diverses raisons, j'ai parfois besoin d'utiliser ctrl- \.
Thomas
Si c'est votre code, alors un problème de développement votre code doit traiter les signaux
user151019
@ Mark a accepté - c'était un problème alors que je n'avais pas encore ce comportement qui fonctionnait dans certains cas marginaux.
Thomas

Réponses:

18

Si vous ne voulez jamais voir les boîtes de dialogue de rapport de plantage, il est préférable de les désactiver:

defaults write com.apple.CrashReporter DialogType none

Déconnectez-vous et reconnectez-vous pour appliquer les modifications.

Lri
la source
2
La déconnexion n'était pas requise dans mon cas.
Cory Klein
6
Existe-t-il un moyen de le faire de defaults write com.apple.CrashReporter DialogType nonemanière sélective pour une application particulière uniquement?
SexyBeast
Pour moi, ce comportement n'a pas changé (après avoir entré la commande) jusqu'à la déconnexion et la connexion.
r_alex_hall
12

Vous pouvez également faire apparaître le message sous forme de notification:

defaults write com.apple.CrashReporter UseUNC 1
Tim Baverstock
la source
2
Comme celui-ci. Sur macOS Sierra, une bannière de notification glisse en haut à droite de l'écran et disparaîtra d'elle-même, mais si vous cliquez dessus, vous obtenez la fenêtre de vidage sur incident complète d'origine. C'est donc parfait. Beaucoup moins envahissant mais laisse des options ouvertes.
clearlight
3

Le comportement par défaut lors de la réception de SIGQUIT est de vider le cœur et de quitter; le crash reporter est déclenché dans le cadre de ce processus.

En commençant par 10.5 (?), Il suffit de définir un gestionnaire de signal pour SIGQUIT pour éviter le crash reporter; vous souhaiterez probablement que le gestionnaire appelle également 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()

Le code ci-dessus a été testé sur 10.8.5 contre /usr/bin/pythonlequel est 2.7.2.

Chris Johnsen
la source
1
Existe-t-il un moyen de le faire de defaults write com.apple.CrashReporter DialogType nonemanière sélective pour une application particulière uniquement?
SexyBeast