¿Encuentra todas las tareas que no responden desde la línea de comando en Mac OS X?

¿Encuentra todas las tareas que no responden desde la línea de comando en Mac OS X?

Sé que puedo hacerlo, ps -aux | xargs killetc., pero quiero enumerar los PID de todas las tareas que no responden (los rojos en el Monitor de actividad). ¿Qué comando puedo ejecutar en la terminal para enumerar estas tareas rojas que no responden y finalizarlas automáticamente?

Respuesta1

Alguien ya ha hecho más o menos la misma pregunta en¿Cómo puedo determinar si una aplicación no responde?(Determinar qué procesos no responden es la parte difícil, matarlos es bastante fácil). He citado una respuesta relevante aquí:

El estado No responde no es un estado de proceso, sino que el proceso ha dejado de comunicarse con el administrador de ventanas/motor gráfico. Podría estar atado en un bucle, colgado de un socket, un archivo remoto, cualquier cosa que lo mantenga regresando al bucle principal que maneja los eventos. El administrador de ventanas nota que los eventos están en cola y, por lo tanto, los etiqueta como "No responde".

Es posible que necesite escribir un pequeño programa X11 que envíe eventos ficticios al proceso y luego eliminarlo si no responde.

Por lo tanto, no es exactamente posible determinar qué programas no responden, al menos no sin recurrir en gran medida a la lógica AppleScript/X11.

Si tiene curiosidad, este pequeño fragmento de AppleScript (hecho para Mavericks, probablemente no funcione en nada más) también se publicó en el hilo vinculado y básicamente identifica todos los programas que no responden y luego KILLles envía una señal:

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

Sin embargo, si ha identificado una aplicación que está funcionando mal, puede eliminar todas las instancias de ella con sudo killall [AppName], por ejemplo sudo killall "Activity Monitor". Puede identificar el PID de aplicaciones individuales con pgrep [AppName], por ejemplo pgrep "Google Chrome", y puede eliminar cualquiera de los PID resultantes con kill [PID].

Respuesta2

Un poco tarde para la fiesta, pero escribí una aplicación de terminal que hará esto por ti. Evita la necesidad de crear secuencias de comandos de la interfaz de usuario en el Monitor de actividad y, en su lugar, utiliza un informe de volcado para determinar los procesos que no responden y los finaliza automáticamente.

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

Respuesta3

Me está molestando en mis cajas Jenkins OSX donde, en ocasiones, parece que algo obstruye mis sistemas. Para poder obtener mejores detalles sobre cualquier problema. ¡Probaré esto, hattip @coldlogic por la idea de usar spindump!

    $ 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

Hoy pude reproducir la causa del bloqueo de las preferencias del sistema, así que pude usarlo como prueba. ¡Que esto ayude al futuro, a mí o a alguien más!

Respuesta4

Gracias por coldlogic. He escrito una aplicación de terminal para eliminar procesos que no responden en macos. (Swift, funciona bien en 10.12+)

https://github.com/redanula/UnresponsiveCapture

información relacionada