Zapobiegaj komunikatowi „<application> nieoczekiwanie zamknij” na sigquit

18

Zabijam procesy Pythona za pomocą SIGQUIT, naciskając Ctrl\czasami (zazwyczaj moje własne, które działają nieprawidłowo). Czy mogę zapobiec komunikatowi „Nieoczekiwane zamknięcie Pythona”? Wiem, że mogę po prostu uciec, więc nie jest tak źle.

„Python nieoczekiwanie zakończył pracę”.  dialog

Tomasz
źródło
1
Dlaczego zamiast tego nie używasz Control-C? SIGTERM nie powoduje wyświetlenia wiadomości.
ughoavgfhw
@ughoavgfhw Pracuję nad REPL, która czasami ustawia terminal w trybie surowym, więc mój program zamiast tego otrzymuje ctrl-c jako naciśnięcie klawisza. Czasami mam też problemy z wątkami, na przykład wątki, które powinny umrzeć, w Pythonie ctrl-c wydaje się tylko zabijać główny wątek. (Wiem, że powinienem z nich korzystać t.daemon = Truei w większości jestem). Z różnych powodów czasami muszę używać ctrl- \.
Thomas
Jeśli jest to Twój kod, to problem programistyczny, z którym Twój kod ma do czynienia z sygnałami
151019,
@Mark zgodził się - był to problem, gdy nie miałem jeszcze takiego zachowania działającego w niektórych przypadkach krawędzi.
Thomas

Odpowiedzi:

18

Jeśli nigdy nie chcesz widzieć okien dialogowych raportów o awariach, możesz je wyłączyć:

defaults write com.apple.CrashReporter DialogType none

Wyloguj się i zaloguj ponownie, aby zastosować zmiany.

Lri
źródło
2
Wylogowanie nie było wymagane w moim przypadku.
Cory Klein
6
Czy istnieje sposób na defaults write com.apple.CrashReporter DialogType noneselektywne wybieranie tylko jednej konkretnej aplikacji?
SexyBeast,
Dla mnie to zachowanie nie zmieniło się (po wprowadzeniu polecenia) do czasu wylogowania i zalogowania.
r_alex_hall
12

Zamiast tego możesz również sprawić, że wiadomość pojawi się jako powiadomienie:

defaults write com.apple.CrashReporter UseUNC 1
Tim Baverstock
źródło
2
Jak ten. W systemie macOS Sierra baner powiadomień przesuwa się w prawym górnym rogu ekranu i sam znika, ale po kliknięciu pojawi się oryginalne pełne okno zrzutu awaryjnego. To jest idealne. O wiele mniej natrętny, ale pozostawia otwarte opcje.
jasne
3

Domyślne zachowanie podczas odbierania SIGQUIT to zrzucenie rdzenia i wyjście; raportowanie awarii jest uruchamiane w ramach tego procesu.

Zaczynając od 10.5 (?) Wystarczy ustawić moduł obsługi sygnału dla SIGQUIT, aby uniknąć zgłaszania awarii; prawdopodobnie będziesz chciał, aby program obsługiwał również wywołanie 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()

Powyższy kod został przetestowany w wersji 10.8.5, w porównaniu z wersją /usr/bin/python2.7.2.

Chris Johnsen
źródło
1
Czy istnieje sposób na defaults write com.apple.CrashReporter DialogType noneselektywne wybieranie tylko jednej konkretnej aplikacji?
SexyBeast,