Alle nicht reagierenden Aufgaben über die Befehlszeile in Mac OS X finden?

Alle nicht reagierenden Aufgaben über die Befehlszeile in Mac OS X finden?

Ich weiß, dass ich das tun kann ps -aux | xargs killusw., aber ich möchte die PIDs aller Aufgaben auflisten, die nicht reagieren (die roten im Aktivitätsmonitor). Welchen Befehl kann ich im Terminal ausführen, um diese roten, nicht reagierenden Aufgaben aufzulisten und sie automatisch zu beenden?

Antwort1

Jemand hat bereits so ziemlich die gleiche Frage gestellt beiWie kann ich feststellen, ob eine Anwendung nicht reagiert?(Festzustellen, welche Prozesse nicht reagieren, ist der schwierige Teil, sie zu beenden ist ziemlich einfach). Ich habe hier eine relevante Antwort zitiert:

Der Status „Keine Antwort“ ist kein Prozessstatus, sondern der Prozess hat die Kommunikation mit dem Fenstermanager/der Grafik-Engine eingestellt. Er könnte in einer Schleife festhängen, an einem Socket, einer Remote-Datei oder irgendetwas anderem hängen, das ihn dazu bringt, zur Hauptschleife zurückzukehren, die Ereignisse verarbeitet. Der Fenstermanager bemerkt, dass Ereignisse in die Warteschlange gestellt werden, und kennzeichnet ihn daher als „Keine Antwort“.

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

Daher ist es nicht genau möglich, zu bestimmen, welche Programme nicht reagieren, zumindest nicht ohne stark auf die AppleScript/X11-Logik zurückzugreifen.

Falls es Sie interessiert: Dieser kleine AppleScript-Schnipsel (für Mavericks entwickelt, funktioniert wahrscheinlich auf keinem anderen Betriebssystem) wurde ebenfalls im verlinkten Thread gepostet. Er identifiziert grundsätzlich alle nicht reagierenden Programme und sendet KILLihnen dann ein Signal:

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

Wenn Sie jedoch eine Anwendung identifiziert haben, die Probleme verursacht, können Sie alle Instanzen davon mit beenden sudo killall [AppName], z. B. sudo killall "Activity Monitor". Sie können die PID einzelner Anwendungen mit ermitteln pgrep [AppName], z. B. pgrep "Google Chrome", und Sie können alle resultierenden PIDs mit beenden kill [PID].

Antwort2

Ein bisschen spät dran, aber ich habe eine Terminalanwendung geschrieben, die das für Sie erledigt. Sie macht das UI-Scripting des Aktivitätsmonitors überflüssig und verwendet stattdessen einen Spindump-Bericht, um die nicht reagierenden Prozesse zu ermitteln und sie automatisch für Sie zu beenden.

https://github.com/cold-logic/killunresponsive

Antwort3

Es nervt mich auf meinen Jenkins OSX-Boxen, wo es so aussieht, als ob etwas meine Systeme gelegentlich verstopft. Um bessere Details zu etwaigen Problemen zu erhalten. Ich werde das versuchen, Hut ab vor @coldlogic für die Idee, Spindump zu verwenden!

    $ sudo spindump -notarget 5  -timelimit 60 -stdout -noFile  -noProcessingWhileSampling   -aggregateStacksByProcess | grep -B 8 "Unresponsive for"
Sampling all processes for 5 seconds with 10 milliseconds of run time between samples
Sampling completed, processing symbols...

Process:         System Preferences [31152]
Path:            /Applications/System Preferences.app/Contents/MacOS/System Preferences
Architecture:    x86_64
Parent:          launchd [1]
UID:             982457465
Task size:       38.81 MB (-20 KB)
CPU Time:        <0.001s (263.8K cycles, 65.8K instructions, 4.01c/i)
Note:            Unresponsive for 2258 seconds before sampling

Heute konnte ich das Problem reproduzieren, das zum Hängenbleiben der Sysprefs führte, sodass ich es als Test verwenden konnte. Vielleicht hilft das meinem zukünftigen Ich oder jemand anderem!

Antwort4

Danke für Coldlogic. Ich habe eine Terminalanwendung geschrieben, um nicht reagierende Prozesse unter macOS zu beenden. (Swift, funktioniert einwandfrei unter 10.12+)

https://github.com/redanula/UnresponsiveCapture

verwandte Informationen