Cegah pesan "<aplikasi> berhenti secara tak terduga" di sigquit

18

Saya membunuh proses Python dengan SIGQUIT dengan menekan Ctrl\kadang-kadang (biasanya saya sendiri yang nakal). Bisakah saya mencegah pesan "Python berhenti tiba-tiba"? Saya tahu saya bisa saja melarikan diri, jadi tidak terlalu buruk.

"Python berhenti secara tak terduga."  dialog

Thomas
sumber
1
Kenapa kamu tidak menggunakan control-C saja? SIGTERM tidak menyebabkan pesan.
ughoavgfhw
@ughoavgfhw Saya sedang mengerjakan REPL yang terkadang menempatkan terminal dalam mode mentah, jadi program saya menerima ctrl-c sebagai keystroke sebagai gantinya. Juga kadang-kadang saya memiliki masalah utas, sehingga utas yang seharusnya mati tidak, dan dengan Python ctrl-c tampaknya hanya untuk membunuh utas utama. (Saya tahu saya harus menggunakan t.daemon = Trueini, dan saya sebagian besar) Untuk berbagai alasan, kadang-kadang saya perlu menggunakan ctrl- \.
Thomas
Jika itu adalah kode Anda maka masalah pengembangan kode Anda harus berurusan dengan sinyal
user151019
@ Mark setuju - ini adalah masalah sementara saya belum memiliki perilaku yang bekerja dalam kasus tepi tertentu.
Thomas

Jawaban:

18

Jika Anda tidak pernah ingin melihat dialog laporan kerusakan, ada preferensi untuk menonaktifkannya:

defaults write com.apple.CrashReporter DialogType none

Logout dan kembali untuk menerapkan perubahan.

Lri
sumber
2
Logout tidak diperlukan dalam kasus saya.
Cory Klein
6
Apakah ada cara untuk melakukan defaults write com.apple.CrashReporter DialogType noneselektif hanya untuk satu aplikasi tertentu?
SexyBeast
Bagi saya perilaku ini tidak berubah (setelah memasukkan perintah) sampai keluar dan masuk.
r_alex_hall
12

Anda juga dapat membuat pesan muncul sebagai pemberitahuan:

defaults write com.apple.CrashReporter UseUNC 1
Tim Baverstock
sumber
2
Seperti yang ini. Di macOS Sierra, sebuah spanduk pemberitahuan meluncur di kanan atas layar dan akan menghilang dengan sendirinya tetapi jika Anda mengkliknya, Anda mendapatkan jendela penuh tempat sampah. Jadi ini sempurna. Jauh lebih tidak mencolok tetapi membiarkan opsi terbuka.
clearlight
3

Perilaku default saat menerima SIGQUIT adalah membuang core dan keluar; reporter macet dipicu sebagai bagian dari proses ini.

Mulai dengan 10.5 (?) Cukup dengan mengatur pengendali sinyal untuk SIGQUIT harus cukup untuk menghindari reporter crash; Anda mungkin ingin pawang juga memanggil keluar.

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

Kode di atas diuji pada 10.8.5 /usr/bin/pythondan 2.7.2.

Chris Johnsen
sumber
1
Apakah ada cara untuk melakukan defaults write com.apple.CrashReporter DialogType noneselektif hanya untuk satu aplikasi tertentu?
SexyBeast