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


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.


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

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.