Verhindert, dass die Meldung "<Anwendung> unerwartet beendet" bei Sigquit angezeigt wird

18

Ich beende Python-Prozesse mit SIGQUIT, indem ich Ctrl\manchmal drücke (normalerweise meine eigenen, die sich schlecht benehmen). Kann ich die Meldung "Python wird unerwartet beendet" verhindern? Ich weiß, ich kann nur entkommen, also ist es nicht so schlimm.

"Python wurde unerwartet beendet."  Dialog

Thomas
quelle
1
Warum benutzt du stattdessen nicht control-C? SIGTERM verursacht die Meldung nicht.
Ughoavgfhw
@ughoavgfhw Ich arbeite an einer REPL, die das Terminal manchmal in den Raw-Modus versetzt, sodass mein Programm stattdessen die Tastenkombination Strg-C empfängt. Manchmal habe ich auch Thread-Probleme, so dass Threads, die sterben sollten, dies nicht tun, und in Python scheint Strg-C nur den Haupt-Thread abzubrechen. (Ich weiß, ich sollte t.daemon = Trueauf diesen verwenden, und ich bin zum größten Teil) Aus verschiedenen Gründen muss ich manchmal Strg- \ verwenden.
Thomas
Wenn es sich um Ihren Code handelt, muss sich Ihr Code um ein Entwicklungsproblem mit Signalen
kümmern
@Mark Einverstanden - Dies war ein Problem, obwohl ich dieses Verhalten in bestimmten Randfällen noch nicht hatte.
Thomas

Antworten:

18

Wenn Sie die Absturzberichtsdialoge nie sehen möchten, können Sie sie deaktivieren:

defaults write com.apple.CrashReporter DialogType none

Melden Sie sich ab und wieder an, um die Änderungen zu übernehmen.

Lri
quelle
2
Abmelden war in meinem Fall nicht erforderlich.
Cory Klein
6
Gibt es eine Möglichkeit, das defaults write com.apple.CrashReporter DialogType noneselektiv nur für eine bestimmte App zu tun ?
SexyBeast
Für mich hat sich dieses Verhalten (nach Eingabe des Befehls) bis zum Abmelden und Anmelden nicht geändert.
r_alex_hall
12

Sie können die Nachricht stattdessen auch als Benachrichtigung anzeigen lassen:

defaults write com.apple.CrashReporter UseUNC 1
Tim Baverstock
quelle
2
Wie dieser. Unter macOS Sierra wird ein Benachrichtigungsbanner oben rechts auf dem Bildschirm eingeblendet und verschwindet von selbst. Wenn Sie darauf klicken, wird jedoch das ursprüngliche vollständige Absturzabbildfenster angezeigt. Das ist also perfekt. Viel weniger aufdringlich, lässt aber Optionen offen.
Clearlight
3

Das Standardverhalten beim Empfang von SIGQUIT besteht darin, den Core zu sichern und zu beenden. Der Crash-Reporter wird dabei ausgelöst.

Ab 10.5 (?) Sollte das einfache Setzen eines Signal-Handlers für SIGQUIT ausreichen, um den Crash-Reporter zu vermeiden. Sie möchten wahrscheinlich, dass der Handler auch exit aufruft.

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()

Der obige Code wurde auf 10.8.5 getestet, gegenüber /usr/bin/pythondem 2.7.2.

Chris Johnsen
quelle
1
Gibt es eine Möglichkeit, das defaults write com.apple.CrashReporter DialogType noneselektiv nur für eine bestimmte App zu tun ?
SexyBeast