sigquitで「<application>が予期せず終了する」メッセージを防ぐ


18

SIGQUITを押してCtrl\時々Pythonプロセスを強制終了します(通常は、自分自身の動作がおかしい)。「Pythonが突然終了する」というメッセージを防ぐことはできますか?逃げるだけでいいので、それほど悪くはありません。

「Pythonが突然終了しました。」 ダイアログ


1
代わりにcontrol-Cを使用しないのはなぜですか?SIGTERMはメッセージを引き起こしません。
ughoavgfhw

@ughoavgfhw REPLに取り組んでおり、端末をrawモードにすることがあるため、プログラムはctrl-cを代わりにキーストロークとして受け取ります。また、スレッドの問題が発生することもあります。たとえば、死ぬべきスレッドはそうではなく、Pythonではctrl-cはメインスレッドのみを強制終了するようです。(私t.daemon = Trueはこれらで使用する必要があることを知っており、私はほとんどの場合)さまざまな理由で、時々ctrl- \を使用する必要があります。
トーマス

それはあなたのコードがある場合は、あなたのコードが持つ開発課題は、信号に対処する
user151019

@Mark Agreed-これは問題でしたが、特定のエッジケースでは動作がまだ動作していませんでした。
トーマス14

回答:


18

クラッシュレポートダイアログを表示したくない場合は、それらを無効にする設定があります。

defaults write com.apple.CrashReporter DialogType none

ログアウトしてから再度ログインして、変更を適用します。


2
私の場合、ログアウトは必要ありませんでした。
コリークライン14年

6
defaults write com.apple.CrashReporter DialogType none特定の1つのアプリのみを選択的に実行する方法はありますか?
SexyBeast

私にとって、この動作はログアウトしてログインするまで(コマンドを入力した後)変更されませんでした
。– r_alex_hall

12

代わりに、メッセージを通知として表示することもできます。

defaults write com.apple.CrashReporter UseUNC 1

2
このように。macOS Sierraでは、画面の右上に通知バナーがスライドして表示されますが、それをクリックすると元の完全なクラッシュダンプウィンドウが表示されます。これは完璧です。あまり目立たないが、オプションは開いたままにします。
クリアライト

3

SIGQUITを受け取ったときのデフォルトの動作は、コアをダンプして終了することです。クラッシュレポーターは、このプロセスの一部としてトリガーされます。

10.5(?)以降では、クラッシュレポーターを回避するには、SIGQUITのシグナルハンドラーを設定するだけで十分です。おそらくハンドラーも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()

上記のコードは、10.8.5で/usr/bin/python2.7.2 に対してテストされました。


1
defaults write com.apple.CrashReporter DialogType none特定の1つのアプリのみを選択的に実行する方法はありますか?
SexyBeast
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.