Como posso determinar se um aplicativo não está respondendo?

11

Eu tenho um aplicativo no OSX que entra repetidamente no estado Não responde e precisa ser forçado a matar. Eu esperava automatizá-lo, mas, ao inspecionar o processo com o ps , não vejo nada que corresponda ao estado Não está respondendo. Eu olhei para o indicador de estado , mas o aplicativo mostra como S se está respondendo ou não.

state O estado é dado por uma sequência de caracteres, por exemplo, `` RWNA ''. O primeiro caractere indica o estado de execução do processo:

  • I Marca um processo que está ocioso (inativo por mais de 20 segundos).
  • R Marca um processo executável.
  • S Marca um processo que dorme por menos de 20 segundos.
  • T Marca um processo parado.
  • U Marca um processo em espera ininterrupta.
  • Z Marca um processo morto (um `` zumbi '').

Como posso determinar se o processo está não está respondendo como o Gerenciador de atividade faz?


Também estou aberto a soluções AppleScript.

Cruz
fonte

Respostas:

9

O estado Não está respondendo não é um processo, mas o processo parou de se comunicar com o gerenciador de janelas / mecanismo gráfico. Pode ser amarrado em um loop, pendurado em um soquete, arquivo remoto, qualquer coisa que o mantenha retornando ao loop principal que lida com eventos. O gerenciador de janelas percebe que os eventos estão sendo enfileirados e o rotula como "Não está respondendo"

Pode ser necessário escrever um pequeno programa X11 que envie eventos fictícios para o processo e depois matá-lo, se não responder.

JvO
fonte
Talvez escrevendo algo com AppleScript que seja como acesso no nível da interface do usuário.
Matthieu Riegler
@MatthieuRiegler Como você faria isso no AppleScript?
187 Ross C.
Eu forneci um exemplo em outra resposta.
Matthieu Riegler
4

Aqui está um AppleScript usando scripts de interface do usuário que procura por um processo de não resposta e os mata.

Ele funcionará com o Activity Monitor of Mavericks. Porém, como se trata de scripts da interface do usuário e como a interface do usuário do Activity Monitor foi alterada, provavelmente não funcionará com o OS X mais antigo sem algumas pequenas modificações.

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
fonte
Eu recebo um erro de compilação na linha tell radio button 1 of radio. Eu removi isso e ajustei algumas outras coisas (eu só quero matar um programa específico) e recebo o erro de tempo de execução: 'error "Os Eventos do Sistema obtiveram um erro: o acesso a dispositivos auxiliares está desativado." número -1719 da janela 1 do processo "Activity Monitor" '
C. Ross
Executou esse script no OSX Mavericks?
Matthieu Riegler
OSX 10.8, então não.
18113 Ross C.
trabalhou em 10.12.5 depois de mudar paratell radio button 1 of radio group 1 of group 2 of toolbar 1 of window 1 to click
Charlie Gorichanaz 1/11
0

(Postando isso como uma resposta separada, já que há muito tempo para caber em um comentário)

Os nossos agradecimentos a @MatthieuRiegler pelo script original.

Isso funcionou em 10.12.6 e é uma pequena modificação do script original (vi o comentário de @ CharlieGorichanaz depois que eu fiz minha própria investigação):


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 No macOS 10.12.x, a barra de ferramentas contém uminsira a descrição da imagem aquiíconeadicionaldevido ao qual está o conjunto de botões (CPU, Memória, Energia, etc.) em group 2 of toolbar 1vez degroup 1 of toolbar 1. Na ausência desse ícone (não confirmei nas versões mais antigas do macOS), acredito que os botões da CPU etc. estariam emgroup 1 of toolbar 1

** 2 Isso se aplica se você já arrastou a coluna PID na coluna Atividade para uma posição diferente. Eu arrastei a coluna PID para a posição mais à esquerda, então nesta linha, tive que alterar o índice para1:

set pid to value of text field 1 of aProcess

As colunas são numeradas a partir da extremidade esquerda, começando em 1. Portanto, ajuste o índice realçado na linha acima, se necessário.

Ashutosh Jindal
fonte