Come posso determinare se un'applicazione non risponde?


11

Ho un'applicazione su OSX che va ripetutamente in uno stato di Non risposta e deve essere forzata a morire. Speravo di automatizzarlo, ma quando ispeziono il processo con ps non vedo nulla che corrisponda allo stato Non risponde. Ho guardato l' indicatore di stato , ma l'app mostra come S se sta rispondendo o meno.

stato Lo stato è dato da una sequenza di caratteri, ad esempio `` RWNA ''. Il primo carattere indica lo stato di esecuzione del processo:

  • I Contrassegna un processo inattivo (inattivo per più di 20 secondi circa).
  • R Contrassegna un processo eseguibile.
  • S Segna un processo che sta dormendo per meno di circa 20 secondi.
  • T Contrassegna un processo interrotto.
  • U Contrassegna un processo in attesa ininterrotta.
  • Z Segna un processo morto (uno `` zombi '').

Come posso determinare se il processo non risponde come fa Activity Manager?


Sono aperto anche alle soluzioni AppleScript.

Risposte:


9

Lo stato Non risponde non è uno stato del processo, ma piuttosto il processo ha smesso di comunicare con il gestore delle finestre / il motore grafico. Potrebbe essere legato in un ciclo, appeso a un socket, file remoto, tutto ciò che lo fa tornare al ciclo principale che gestisce gli eventi. Il gestore delle finestre nota che gli eventi sono in coda e quindi lo etichetta come "Non risponde"

Potrebbe essere necessario scrivere un piccolo programma X11 che invia eventi fittizi al processo, quindi ucciderlo se non risponde.


Forse scrivendo qualcosa con AppleScript che come accesso a livello di interfaccia utente.
Matthieu Riegler,

@MatthieuRiegler Come lo faresti in AppleScript?
C. Ross,

Ho fornito un esempio in un'altra risposta.
Matthieu Riegler,

4

Ecco un AppleScript che utilizza script dell'interfaccia utente che cerca un processo che non risponde e li uccide.

Funzionerà con Activity Monitor di Mavericks. Ma poiché si tratta di scripting dell'interfaccia utente e poiché l'interfaccia utente di Activity Monitor è cambiata, molto probabilmente non funzionerà con OS X precedente senza alcune modifiche minori.

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

Ottengo un errore di compilazione sulla riga tell radio button 1 of radio. L'ho rimosso e modificato alcune altre cose (voglio solo uccidere un programma specifico) e ottenere l'errore di runtime: 'errore "Gli eventi di sistema hanno ricevuto un errore: l'accesso per i dispositivi di assistenza è disabilitato". numero -1719 dalla finestra 1 del processo "Activity Monitor" '
C. Ross

Ha eseguito quello script su OSX Mavericks?
Matthieu Riegler,

OSX 10.8, quindi no.
C. Ross,

ha lavorato il 10.12.5 dopo essere passato atell radio button 1 of radio group 1 of group 2 of toolbar 1 of window 1 to click
Charlie Gorichanaz il

0

(Pubblicando questa come una risposta separata da troppo tempo per inserirla in un commento)

Ringraziamo @MatthieuRiegler per la sceneggiatura originale.

Questo ha funzionato il 10.12.6 ed è una piccola modifica della sceneggiatura originale (visto il commento di @ CharlieGorichanaz dopo aver fatto le mie indagini):


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, la barra degli strumenti contiene un ulterioreinserisci qui la descrizione dell'immagineun'icona grazie al quale la serie di pulsanti (CPU, memoria, energia, ecc) sono in group 2 of toolbar 1invecegroup 1 of toolbar 1. In assenza di quell'icona (non ho confermato nelle versioni precedenti di macOS), credo che i pulsanti CPU ecc. Sarebbero presentigroup 1 of toolbar 1

** 2 Questo vale se hai mai trascinato la colonna PID nella colonna Attività in una posizione diversa. Avevo trascinato la colonna PID nella posizione più a sinistra, quindi su questa riga ho dovuto modificare l'indice in1:

set pid to value of text field 1 of aProcess

Le colonne sono numerate dall'estrema sinistra, a partire da 1. Quindi, se necessario, regola di conseguenza l'indice evidenziato nella riga sopra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.