Як я можу визначити, чи не відповідає програма?


11

У мене є програма на OSX, яка неодноразово переходить у стан, що не відповідає, і її потрібно насильно вбити. Я сподівався його автоматизувати, але під час огляду процесу з ps я не бачу нічого, що б відповідало стану, що не відповідає. Я подивився на показник стану , але додаток показує як S , реагує він чи ні.

стан Стан задається послідовністю символів, наприклад, `` RWNA ''. Перший символ вказує стан запуску процесу:

  • Я Позначає процес, що працює в режимі очікування (спить довше, ніж приблизно 20 секунд).
  • R Позначає процес, який можна виконати.
  • S Позначає процес, який спить менше 20 секунд.
  • T Позначає зупинений процес.
  • U Позначає процес в режимі безперебійного очікування.
  • Z Позначає мертвий процес (`` зомбі '').

Як я можу визначити , якщо процес не відповідає , як це робить діяльність менеджера?


Я також відкритий для AppleScript-рішень.

Відповіді:


9

Стан, що не відповідає, це не стан процесу, а швидше процес припинив спілкування з менеджером вікон / графічним двигуном. Він може бути пов'язаний у циклі, вивішеному на розетці, віддаленому файлі, будь-що, що змушує його повертатися до основного циклу, який обробляє події. Диспетчер вікон помічає події в черзі і, таким чином, позначає його як "Не відповідає"

Можливо, вам доведеться написати невелику програму X11, яка надсилає манекені події в процес, а потім вбивати її, якщо вона не відповідає.


Можливо, написати щось з AppleScript, що як доступ до інтерфейсу користувача.
Матьє Ріглер

@MatthieuRiegler Як би ви це зробили в AppleScript?
К. Росс

Я подав приклад в іншій відповіді.
Матьє Ріглер

4

Ось AppleScript, що використовує сценарій інтерфейсу користувача, який шукає процес, що не відповідає, і вбиває їх.

Він буде працювати з Монітором активності Mavericks. Але оскільки це сценарій інтерфейсу користувача і оскільки змінився інтерфейс користувача Monitor Monitor, швидше за все, це не працюватиме зі старшою ОС 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. Я видалив це і підкоригував деякі інші речі (я хочу лише вбити конкретну програму) і отримую помилку під час виконання: 'error' Системні події отримали помилку: доступ для допоміжних пристроїв вимкнено. " номер -1719 з вікна 1 процесу "Монітор активності" '
C. Ross

Чи запускали цей сценарій на OSX Mavericks?
Матьє Ріглер

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
Чарлі Горічаназ

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 на панелі інструментів є додатковавведіть тут опис зображенняпіктограма, завдяки якій набір кнопок (процесор, пам'ять, енергія тощо) знаходяться group 2 of toolbar 1замістьgroup 1 of toolbar 1. За відсутності цієї піктограми (я не підтверджував її у старих версіях macOS), я вважаю, що кнопки процесора і т.д.group 1 of toolbar 1

** 2 Це застосовується, якщо ви коли-небудь перетягували стовпець PID у стовпці "Діяльність" в інше місце. Я перетягнув стовпчик PID в крайнє ліве місце, тому в цьому рядку мені довелося змінити індекс на1:

set pid to value of text field 1 of aProcess

Стовпці нумеруються в крайньому лівому куті, починаючи з 1. Тому відповідно коригуйте виділений індекс у наведеному вище рядку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.