Wie kann ich feststellen, ob eine Anwendung nicht antwortet?

11

Ich habe eine Anwendung unter OSX, die wiederholt in den Status "Nicht reagiert" wechselt und zwangsweise getötet werden muss. Ich hatte gehofft, es zu automatisieren, aber wenn ich den Prozess mit ps inspiziere, sehe ich nichts, was dem Status "Nicht antworten" entspricht. Ich sah auf die Zustandsanzeige, aber die App zeigt als S ob es reagiert oder nicht.

state Der Status wird durch eine Folge von Zeichen angegeben, z. B. "RWNA". Das erste Zeichen gibt den Ausführungsstatus des Prozesses an:

  • I Markiert einen Prozess, der im Leerlauf ist (länger als etwa 20 Sekunden schlafen).
  • R Markiert einen ausführbaren Prozess.
  • S Markiert einen Prozess, der weniger als 20 Sekunden lang schläft.
  • T Markiert einen gestoppten Prozess.
  • U Markiert einen Prozess in ununterbrochener Wartezeit.
  • Z Markiert einen toten Prozess (ein "Zombie").

Wie kann ich feststellen, ob der Prozess nicht wie der Aktivitätsmanager reagiert?


Ich bin auch offen für AppleScript-Lösungen.

Kreuz
quelle

Antworten:

9

Der Status "Nicht antworten" ist kein Prozessstatus, sondern der Prozess hat die Kommunikation mit dem Fenstermanager / der grafischen Engine beendet. Es könnte in einer Schleife gebunden sein und an einem Socket oder einer entfernten Datei hängen, alles, was es dazu bringt, zur Hauptschleife zurückzukehren, die Ereignisse behandelt. Der Fenstermanager bemerkt, dass Ereignisse in die Warteschlange gestellt werden, und bezeichnet sie daher als "Nicht antwortend".

Möglicherweise müssen Sie ein kleines X11-Programm schreiben, das Dummy-Ereignisse an den Prozess sendet, und es dann beenden, wenn es nicht reagiert.

JvO
quelle
Vielleicht etwas mit AppleScript schreiben, das als UI-Level-Zugriff dient.
Matthieu Riegler
@MatthieuRiegler Wie würden Sie das in AppleScript machen?
C. Ross
Ich habe in einer anderen Antwort ein Beispiel angegeben.
Matthieu Riegler
4

Hier ist ein AppleScript mit UI-Skripten, das nach einem nicht reagierenden Prozess sucht und diese beendet.

Es funktioniert mit dem Aktivitätsmonitor von Mavericks. Da es sich jedoch um UI-Skripte handelt und die Benutzeroberfläche von Activity Monitor geändert wurde, funktioniert dies höchstwahrscheinlich nicht mit älteren OS X ohne geringfügige Änderungen.

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
Matthieu Riegler
quelle
Ich erhalte einen Kompilierungsfehler in der Zeile tell radio button 1 of radio. Ich habe das entfernt und einige andere Dinge optimiert (ich möchte nur ein bestimmtes Programm beenden) und erhalte den Laufzeitfehler: 'Fehler "Systemereignisse haben einen Fehler erhalten: Der Zugriff für Hilfsgeräte ist deaktiviert." Nummer -1719 aus Fenster 1 des Prozesses "Aktivitätsmonitor"
C. Ross
Haben Sie dieses Skript unter OSX Mavericks ausgeführt?
Matthieu Riegler
OSX 10.8, also nein.
C. Ross
arbeitete am 10.12.5 nach dem Wechsel zutell radio button 1 of radio group 1 of group 2 of toolbar 1 of window 1 to click
Charlie Gorichanaz
0

(Dies als separate Antwort zu posten, da es zu lange dauert, um in einen Kommentar zu passen.)

Dank an @MatthieuRiegler für das Original-Skript.

Dies funktionierte am 10.12.6 und ist eine geringfügige Änderung des ursprünglichen Skripts (siehe @ CharlieGorichanaz 'Kommentar, nachdem ich meine eigenen Untersuchungen durchgeführt hatte):


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 In macOS 10.12.x enthält die Symbolleiste ein zusätzlichesGeben Sie hier die Bildbeschreibung einSymbol, aufgrund dessen sich die Schaltflächen (CPU, Speicher, Energie usw.) group 2 of toolbar 1anstelle von befindengroup 1 of toolbar 1. Ohne dieses Symbol (ich habe es in älteren MacOS-Versionen nicht bestätigt) glaube ich, dass die Schaltflächen für CPU usw. vorhanden sindgroup 1 of toolbar 1

** 2 Dies gilt, wenn Sie die PID-Spalte in der Aktivitätsspalte jemals an eine andere Position gezogen haben. Ich hatte die PID-Spalte an die Position ganz links gezogen, sodass ich in dieser Zeile den Index ändern musste in1:

set pid to value of text field 1 of aProcess

Die Spalten sind von ganz links beginnend bei 1 nummeriert. Passen Sie daher den hervorgehobenen Index in der obigen Zeile bei Bedarf entsprechend an.

Ashutosh Jindal
quelle