Làm cách nào để xác định xem ứng dụng không phản hồi?


11

Tôi có một ứng dụng trên OSX liên tục rơi vào trạng thái Không phản hồi và phải bị buộc phải giết. Tôi đã hy vọng tự động hóa nó, nhưng khi kiểm tra quá trình với ps tôi không thấy bất cứ điều gì tương ứng với trạng thái Không phản hồi. Tôi đã xem chỉ báo trạng thái , nhưng ứng dụng hiển thị là S cho dù nó có phản hồi hay không.

trạng thái Trạng thái được đưa ra bởi một chuỗi các ký tự, ví dụ, `` RWNA ''. Ký tự đầu tiên cho biết trạng thái chạy của quá trình:

  • Tôi Đánh dấu một quá trình không hoạt động (ngủ lâu hơn khoảng 20 giây).
  • R Đánh dấu một quá trình có thể chạy được.
  • S Đánh dấu một quá trình đang ngủ ít hơn khoảng 20 giây.
  • T Đánh dấu một quá trình dừng lại.
  • U Đánh dấu một quá trình trong chờ đợi không bị gián đoạn.
  • Z Đánh dấu một quá trình chết (một `` zombie '').

Làm cách nào tôi có thể xác định nếu quy trình không Phản hồi như Trình quản lý hoạt động thực hiện?


Tôi cũng mở cho các giải pháp AppleScript.

Câu trả lời:


9

Trạng thái Không phản hồi không phải là trạng thái quy trình, mà là quá trình đã ngừng liên lạc với trình quản lý cửa sổ / công cụ đồ họa. Nó có thể được gắn trong một vòng lặp, treo trên ổ cắm, tệp từ xa, bất cứ thứ gì giữ cho nó trở lại vòng lặp chính xử lý các sự kiện. Trình quản lý cửa sổ thông báo các sự kiện đang được xếp hàng và do đó gắn nhãn là "Không phản hồi"

Bạn có thể cần phải viết một chương trình X11 nhỏ gửi các sự kiện giả đến quy trình, sau đó giết nó nếu nó không phản hồi.


Có thể viết một cái gì đó với AppleScript như quyền truy cập cấp độ UI.
Matthieu Riegler

@MatthieuRiegler Bạn sẽ làm điều đó như thế nào trong AppleScript?
C. Ross

Tôi đã cung cấp một ví dụ trong một câu trả lời khác.
Matthieu Riegler

4

Dưới đây là một AppleScript sử dụng kịch bản UI tìm kiếm một quy trình không đáp ứng và giết chết chúng.

Nó sẽ hoạt động với Trình giám sát hoạt động của Mavericks. Nhưng vì đây là kịch bản UI và do UI của Activity Monitor thay đổi, nên nhiều khả năng nó sẽ không hoạt động với OS X cũ hơn mà không có một số sửa đổi nhỏ.

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

Tôi nhận được một lỗi biên dịch trên dòng tell radio button 1 of radio. Tôi đã xóa cái đó và tinh chỉnh một số thứ khác (tôi chỉ muốn giết một chương trình cụ thể) và gặp lỗi thời gian chạy: 'lỗi "Sự kiện hệ thống bị lỗi: Quyền truy cập cho các thiết bị trợ giúp bị vô hiệu hóa." số -1719 từ cửa sổ 1 của quá trình "Giám sát hoạt động" '
C. Ross

Đã chạy tập lệnh đó trên OSX Mavericks?
Matthieu Riegler

OSX 10.8, nên không.
C. Ross

làm việc vào ngày 10.12.5 sau khi đổi thànhtell radio button 1 of radio group 1 of group 2 of toolbar 1 of window 1 to click
Charlie Gorichanaz

0

(Đăng bài này dưới dạng câu trả lời riêng vì quá dài để phù hợp với nhận xét)

Tín dụng cho @MatthieuRiegler cho kịch bản gốc.

Điều này hoạt động vào ngày 10.12.6 và là một sửa đổi nhỏ của kịch bản gốc (đã thấy nhận xét của @ CharlieGorichanaz sau khi tôi thực hiện cuộc điều tra của riêng mình):


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 Trong macOS 10.12.x, thanh công cụ chứa mộtnhập mô tả hình ảnh ở đâybiểu tượngbổ sungdo tập hợp các nút (CPU, Bộ nhớ, Năng lượng, v.v.) group 2 of toolbar 1thay thếgroup 1 of toolbar 1. Không có biểu tượng đó (tôi chưa xác nhận trong các phiên bản macOS cũ hơn), tôi tin rằng các nút CPU vv sẽ ở tronggroup 1 of toolbar 1

** 2 Điều này áp dụng nếu bạn đã từng kéo cột PID trong cột Hoạt động sang một vị trí khác. Tôi đã kéo cột PID sang vị trí ngoài cùng bên trái để trên dòng này, tôi phải thay đổi chỉ mục thành1:

set pid to value of text field 1 of aProcess

Các cột được đánh số từ ngoài cùng bên trái, bắt đầu từ 1. Vì vậy, điều chỉnh chỉ số được tô sáng trong dòng trên cho phù hợp nếu cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.