ป้องกันข้อความ“ แอปพลิเคชัน> ออกโดยไม่คาดหมาย” บน sigquit


18

ฉันฆ่ากระบวนการ Python ด้วย SIGQUIT โดยการกดCtrl\บางครั้ง (โดยปกติจะเป็นของฉันเองที่ทำงานผิดปกติ) ฉันสามารถป้องกันข้อความ "Python ออกโดยไม่คาดหมาย" ได้หรือไม่ ฉันรู้ว่าฉันสามารถหลบหนีได้ดังนั้นมันจึงไม่เลว

"Python เลิกโดยไม่คาดหมาย"  โต้ตอบ


1
ทำไมคุณไม่ใช้ตัวควบคุม -C แทน? SIGTERM ไม่ทำให้เกิดข้อความ
ughoavgfhw

@ughoavgfhw ฉันกำลังใช้งาน REPL ซึ่งบางครั้งทำให้เทอร์มินัลอยู่ในโหมด raw ดังนั้นโปรแกรมของฉันจึงรับ ctrl-c เป็นการกดแป้นแทน บางครั้งฉันมีปัญหาเธรดเช่นเธรดที่ไม่ควรตายและใน Python ctrl-c ดูเหมือนจะฆ่าเธรดหลักเท่านั้น (ฉันรู้ว่าฉันควรใช้t.daemon = Trueกับสิ่งเหล่านี้และฉันเป็นส่วนใหญ่) ด้วยเหตุผลต่าง ๆ บางครั้งฉันต้องใช้ ctrl- \
โทมัส

หากเป็นรหัสของคุณปัญหาในการพัฒนารหัสของคุณจะต้องเกี่ยวข้องกับสัญญาณ
user151019

@ Mark เห็นด้วย - นี่เป็นปัญหาในขณะที่ฉันยังไม่มีพฤติกรรมที่ทำงานในบางกรณีขอบ
โทมัส

คำตอบ:


18

หากคุณไม่ต้องการเห็นกล่องโต้ตอบรายงานข้อขัดข้องมีการกำหนดค่าให้ปิดการใช้งาน:

defaults write com.apple.CrashReporter DialogType none

ออกจากระบบและกลับเข้ามาใหม่เพื่อใช้การเปลี่ยนแปลง


2
ไม่จำเป็นต้องออกจากระบบในกรณีของฉัน
คอรีไคลน์

6
มีวิธีการdefaults write com.apple.CrashReporter DialogType noneเลือกอย่างใดอย่างหนึ่งเท่านั้นหรือไม่
SexyBeast

สำหรับฉันพฤติกรรมนี้ไม่เปลี่ยนแปลง (หลังจากป้อนคำสั่ง) จนกระทั่งออกจากระบบและเข้าสู่ระบบ
r_alex_hall

12

คุณสามารถทำให้ข้อความปรากฏเป็นการแจ้งเตือนแทน:

defaults write com.apple.CrashReporter UseUNC 1

2
แบบนี้ ใน macOS Sierra แบนเนอร์การแจ้งเตือนเลื่อนไปที่ด้านบนขวาของหน้าจอและจะหายไปเอง แต่ถ้าคุณคลิกคุณจะได้รับหน้าต่างการถ่ายโอนข้อมูลความผิดพลาดแบบเต็ม ดังนั้นนี่จึงสมบูรณ์แบบ เสือกน้อยกว่ามาก แต่เปิดตัวเลือกไว้
clearlight

3

พฤติกรรมเริ่มต้นเมื่อได้รับ SIGQUIT คือการถ่ายโอนข้อมูลหลักและออก; ตัวรายงานข้อขัดข้องจะถูกเรียกใช้เป็นส่วนหนึ่งของกระบวนการนี้

เริ่มต้นด้วย 10.5 (?) เพียงแค่ตั้งค่าตัวจัดการสัญญาณสำหรับ SIGQUIT ควรจะเพียงพอที่จะหลีกเลี่ยงความผิดพลาดของนักข่าว; คุณอาจต้องการให้ตัวจัดการโทรออกด้วย

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/pythonซึ่งเป็น 2.7.2


1
มีวิธีการdefaults write com.apple.CrashReporter DialogType noneเลือกอย่างใดอย่างหนึ่งเท่านั้นหรือไม่
SexyBeast
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.