¿Cómo puedo determinar si una aplicación no responde?

11

Tengo una aplicación en OSX que entra repetidamente en un estado No responde y debe ser forzada a matar. Esperaba automatizarlo, pero al inspeccionar el proceso con ps no veo nada que corresponda con el estado No responde. Miré el indicador de estado , pero la aplicación muestra como S si está respondiendo o no.

estado El estado viene dado por una secuencia de caracteres, por ejemplo, `` RWNA ''. El primer carácter indica el estado de ejecución del proceso:

  • I Marca un proceso que está inactivo (durmiendo por más de 20 segundos).
  • R Marca un proceso ejecutable.
  • S Marca un proceso que duerme durante menos de unos 20 segundos.
  • T Marca un proceso detenido.
  • U Marca un proceso en espera ininterrumpida.
  • Z Marca un proceso muerto (un `` zombie '').

¿Cómo puedo determinar si el proceso no responde como lo hace el Administrador de actividades?


También estoy abierto a las soluciones AppleScript.

Cruzar
fuente

Respuestas:

9

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 zócalo, archivo remoto, cualquier cosa que lo mantenga regresando al bucle principal que maneja los eventos. El administrador de ventanas advierte que los eventos se están poniendo en cola y, por lo tanto, lo etiqueta como "No responde"

Es posible que deba escribir un pequeño programa X11 que envíe eventos ficticios al proceso, luego elimínelo si no responde.

JvO
fuente
Tal vez escribir algo con AppleScript que como acceso de nivel de interfaz de usuario.
Matthieu Riegler
@MatthieuRiegler ¿Cómo haría eso en AppleScript?
C. Ross
Proporcioné un ejemplo en otra respuesta.
Matthieu Riegler
4

Aquí hay un AppleScript que usa scripts de interfaz de usuario que busca un proceso que no responde y los mata.

Funcionará con el Monitor de actividad de Mavericks. Pero como se trata de secuencias de comandos de la interfaz de usuario y dado que la interfaz de usuario de Activity Monitor cambió, lo más probable es que esto no funcione con OS X más antiguo sin algunas modificaciones menores.

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
fuente
Me sale un error de compilación en la línea tell radio button 1 of radio. Eliminé eso y modifiqué algunas otras cosas (solo quiero matar un programa específico) y obtuve el error de tiempo de ejecución: 'error "Los eventos del sistema obtuvieron un error: el acceso para dispositivos de asistencia está deshabilitado". número -1719 de la ventana 1 del proceso "Monitor de actividad" '
C. Ross
¿Ejecuté ese script en OSX Mavericks?
Matthieu Riegler
OSX 10.8, entonces no.
C. Ross
trabajó en 10.12.5 después de cambiar atell radio button 1 of radio group 1 of group 2 of toolbar 1 of window 1 to click
Charlie Gorichanaz el
0

(Publicar esto como una respuesta separada ya que es demasiado tiempo para caber en un comentario)

Gracias a @MatthieuRiegler por el guión original.

Esto funcionó en 10.12.6 y es una modificación menor del guión original (vi el comentario de @ CharlieGorichanaz después de haber hecho mi propia investigación):


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 En macOS 10.12.x, la barra de herramientas contiene uningrese la descripción de la imagen aquíiconoadicionaldebido al cual se encuentra el conjunto de botones (CPU, Memoria, Energía, etc.) en group 2 of toolbar 1lugar degroup 1 of toolbar 1. En ausencia de ese icono (no lo he confirmado en versiones anteriores de macOS), creo que los botones de la CPU, etc.group 1 of toolbar 1

** 2 Esto se aplica si alguna vez arrastró la columna PID en la columna Actividad a una posición diferente. Arrastré la columna PID a la posición más a la izquierda, así que en esta línea, tuve que cambiar el índice a1:

set pid to value of text field 1 of aProcess

Las columnas están numeradas desde el extremo izquierdo, comenzando en 1. Por lo tanto, ajuste el índice resaltado en la línea anterior en consecuencia si es necesario.

Ashutosh Jindal
fuente