ฉันจะทราบได้อย่างไรว่าแอปพลิเคชันไม่ตอบสนอง


11

ฉันมีแอปพลิเคชันบน OSX ที่เข้าสู่สถานะไม่ตอบสนองซ้ำแล้วซ้ำอีกและต้องถูกบังคับให้ฆ่า ฉันหวังว่าจะทำให้เป็นอัตโนมัติ แต่เมื่อตรวจสอบกระบวนการด้วยpsฉันไม่เห็นสิ่งใดที่สอดคล้องกับสถานะไม่ตอบสนอง ผมมองที่รัฐบ่งชี้ แต่แสดงให้เห็นว่าเป็น app Sไม่ว่าจะมีการตอบสนองหรือไม่

state สถานะถูกกำหนดโดยลำดับของอักขระตัวอย่างเช่น `` RWNA '' อักขระตัวแรกระบุสถานะการทำงานของกระบวนการ:

  • ฉันทำเครื่องหมายกระบวนการที่ไม่ได้ใช้งาน (กำลังหลับนานกว่าประมาณ 20 วินาที)
  • R ทำเครื่องหมายกระบวนการที่รันได้
  • S ทำเครื่องหมายกระบวนการที่กำลังหลับน้อยกว่าประมาณ 20 วินาที
  • T หมายถึงกระบวนการที่หยุด
  • U ทำเครื่องหมายกระบวนการในการรอเครื่องสำรอง
  • Z ทำเครื่องหมายกระบวนการที่ตายแล้ว ('`zombie' ')

ฉันจะทราบได้อย่างไรว่ากระบวนการไม่ตอบสนองตามที่ตัวจัดการกิจกรรมทำ


ฉันเปิดให้โซลูชั่น AppleScript เช่นกัน

คำตอบ:


9

สถานะไม่ตอบสนองไม่ได้เป็นสถานะของกระบวนการ แต่เป็นกระบวนการที่หยุดการสื่อสารกับเครื่องมือจัดการหน้าต่าง / โปรแกรมกราฟิก มันอาจจะเชื่อมโยงกันเป็นวงวนแขวนอยู่บนซ็อกเก็ตไฟล์ระยะไกลอะไรก็ตามที่ทำให้มันกลับไปสู่วงหลักที่จัดการกับเหตุการณ์ ตัวจัดการหน้าต่างสังเกตเหตุการณ์กำลังเข้าคิวและติดป้ายกำกับว่า "ไม่ตอบสนอง"

คุณอาจต้องเขียนโปรแกรม X11 ขนาดเล็กที่ส่งเหตุการณ์จำลองไปยังกระบวนการจากนั้นฆ่าโปรแกรมหากไม่ตอบสนอง


อาจจะเขียนบางสิ่งด้วย AppleScript ซึ่งเป็นการเข้าถึงระดับ UI
Matthieu Riegler

@MatthieuRiegler คุณจะทำเช่นนั้นใน AppleScript ได้อย่างไร
C. Ross

ฉันให้ตัวอย่างในคำตอบอื่น
Matthieu Riegler

4

นี่คือ AppleScript ที่ใช้สคริปต์ UI ที่ค้นหากระบวนการที่ไม่ตอบสนองและฆ่าพวกเขา

มันจะทำงานร่วมกับ Activity Monitor of Mavericks แต่เนื่องจากนี่คือการสร้างสคริปต์ UI และเนื่องจาก UI ของการตรวจสอบกิจกรรมมีการเปลี่ยนแปลงจึงเป็นไปได้ว่าจะไม่ทำงานกับ OS X รุ่นเก่าโดยไม่มีการแก้ไขเล็กน้อย

tell application "Activity Monitor" to run  --We need to run Activity Monitor
tell application "System Events" to tell process "Activity Monitor"
    tell radio button 1 of radio group 1 of group 1 of toolbar 1 of window 1 to click --Using the CPU View 
    tell outline 1 of scroll area 1 of window 1 -- working with the list 
        set notResponding to rows whose value of first static text contains "Not Responding" -- Looking for Not responding process
        repeat with aProcess in notResponding
            set pid to value of text field 5 of aProcess  -- For each non responding process retrieve the PID 
            if pid is not "" then do shell script ("kill -9 " & pid) -- KILL the PID. 
        end repeat
    end tell
end tell

tell radio button 1 of radioฉันได้รับรวบรวมข้อผิดพลาดในบรรทัด ฉันลบสิ่งนั้นและปรับแต่งสิ่งอื่น ๆ (ฉันเพียงต้องการฆ่าโปรแกรมเฉพาะ) และรับข้อผิดพลาดรันไทม์: 'ข้อผิดพลาด "เหตุการณ์ระบบมีข้อผิดพลาด: การเข้าถึงอุปกรณ์ช่วยเหลือถูกปิดใช้งาน หมายเลข -1719 จากหน้าต่าง 1 ของกระบวนการ "การตรวจสอบกิจกรรม" '
C. Ross

เรียกใช้สคริปต์นั้นใน OSX Mavericks หรือไม่
Matthieu Riegler

OSX 10.8 ไม่เลย
C. Ross

ทำงานใน 10.12.5 หลังจากเปลี่ยนเป็นtell radio button 1 of radio group 1 of group 2 of toolbar 1 of window 1 to click
Charlie Gorichanaz

0

(การโพสต์สิ่งนี้เป็นคำตอบที่แยกกันนานเกินไปที่จะใส่ความคิดเห็น)

ให้เครดิต @MatthieuRiegler สำหรับสคริปต์ต้นฉบับ

สิ่งนี้ใช้ได้ผลในวันที่ 10.12.6 และเป็นการเปลี่ยนแปลงเล็กน้อยของสคริปต์ต้นฉบับ (เห็นความคิดเห็นของ @ CharlieGorichanaz หลังจากที่ฉันทำการสอบสวนของตัวเอง):


set textToSearchForInProcessName to "Not Responding"

--  Run Activity Monitor 
tell application "Activity Monitor" to activate

tell application "System Events" to tell process "Activity Monitor"
    --  Wait for the Activity Monitor window to open
    repeat until (exists window 1)
        delay 1
    end repeat
    --display notification "Window appeared"

    --  Wait for the Menubar to be present
    repeat until (exists menu 1 of menu bar item "View" of menu bar 1)
        delay 1
    end repeat
    --display notification "Menubar appeared"

    --  Make sure View -> My Processes is selected 
    click menu item "My Processes" of menu 1 of menu bar item "View" of menu bar 1

    --  Click the 'CPU View' button  ( **1 ) 
    click radio button 1 of radio group 1 ¬
        of group 2 of toolbar 1 ¬
        of window 1

    --  Working with the list of processes 
    tell outline 1 of scroll area 1 of window 1
        --  Looking for Not responding process  
        set notResponding to rows whose value of ¬
            first static text contains textToSearchForInProcessName

        repeat with aProcess in notResponding

            --  For each non responding process retrieve the PID 
            set pid to value of text field 1 of aProcess -- ( **2 )

            --  Kill that process using pid 
            if pid is not "" then do shell script ("kill -9 " & pid)
        end repeat
    end tell
end tell

** 1 ใน MacOS 10.12.x แถบเครื่องมือมีเพิ่มเติมป้อนคำอธิบายรูปภาพที่นี่ไอคอนเนื่องจากการที่ชุดของปุ่ม (CPU, Memory, พลังงาน, ฯลฯ ) อยู่ใน แทนgroup 2 of toolbar 1 group 1 of toolbar 1หากไม่มีไอคอนนั้น (ฉันยังไม่ได้ยืนยันใน macOS เวอร์ชั่นเก่ากว่า) ฉันเชื่อว่าจะมีปุ่ม CPU ฯลฯgroup 1 of toolbar 1

** 2 สิ่งนี้ใช้ได้หากคุณลากคอลัมน์ PID ในคอลัมน์กิจกรรมไปยังตำแหน่งอื่น ฉันจะลากคอลัมน์ PID ไปยังตำแหน่งซ้ายสุดดังนั้นในบรรทัดนี้ฉันต้องเปลี่ยนดัชนีเป็น1:

set pid to value of text field 1 of aProcess

คอลัมน์จะมีหมายเลขจากด้านซ้ายสุดเริ่มต้นที่ 1 ดังนั้นปรับดัชนีที่ไฮไลต์ในบรรทัดด้านบนตามลำดับหากจำเป็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.