Comment puis-je déterminer si une application ne répond pas?

11

J'ai une application sur OSX qui passe à plusieurs reprises dans un état de non-réponse et doit être tuée de force. J'espérais l'automatiser, mais lors de l'inspection du processus avec ps, je ne vois rien qui corresponde à l'état de non-réponse. J'ai regardé l' indicateur d' état , mais l'application indique comme S si elle répond ou non.

état L'état est donné par une séquence de caractères, par exemple, `` RWNA ''. Le premier caractère indique l'état d'exécution du processus:

  • I Marque un processus inactif (sommeil pendant plus de 20 secondes environ).
  • R Marque un processus exécutable.
  • S Marque un processus qui dort moins de 20 secondes environ.
  • T Marque un processus arrêté.
  • U Marque un processus en attente ininterrompue.
  • Z Marque un processus mort (un `` zombie '').

Comment puis-je déterminer si le processus ne répond pas comme le fait le gestionnaire d'activités?


Je suis également ouvert aux solutions AppleScript.

Traverser
la source

Réponses:

9

L'état de non-réponse n'est pas un état de processus, mais le processus a plutôt cessé de communiquer avec le gestionnaire de fenêtres / moteur graphique. Il peut être attaché dans une boucle, suspendu à une socket, un fichier distant, tout ce qui le fait revenir à la boucle principale qui gère les événements. Le gestionnaire de fenêtres remarque que les événements sont mis en file d'attente et le marque donc comme "Ne répond pas"

Vous devrez peut-être écrire un petit programme X11 qui envoie des événements factices au processus, puis le tuer s'il ne répond pas.

JvO
la source
Peut-être écrire quelque chose avec AppleScript comme accès au niveau de l'interface utilisateur.
Matthieu Riegler
@MatthieuRiegler Comment feriez-vous cela dans AppleScript?
C. Ross
J'ai donné un exemple dans une autre réponse.
Matthieu Riegler
4

Voici un AppleScript utilisant des scripts d'interface utilisateur qui recherche un processus qui ne répond pas et les tue.

Cela fonctionnera avec le moniteur d'activité de Mavericks. Mais comme il s'agit de scripts d'interface utilisateur et que l'interface utilisateur du moniteur d'activité a changé, cela ne fonctionnera probablement pas avec les anciens OS X sans quelques modifications mineures.

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
la source
J'obtiens une erreur de compilation sur la ligne tell radio button 1 of radio. J'ai supprimé cela et modifié quelques autres choses (je veux seulement tuer un programme spécifique) et obtenir l'erreur d'exécution: 'erreur "Les événements système ont une erreur: l'accès pour les appareils et accessoires fonctionnels est désactivé." numéro -1719 de la fenêtre 1 du processus "Moniteur d'activité" '
C. Ross
Avez-vous exécuté ce script sur OSX Mavericks?
Matthieu Riegler
OSX 10.8, donc non.
C. Ross
a travaillé le 10.12.5 après avoir changé pourtell radio button 1 of radio group 1 of group 2 of toolbar 1 of window 1 to click
Charlie Gorichanaz
0

(Publier cela comme une réponse séparée depuis trop longtemps pour tenir dans un commentaire)

Nous remercions @MatthieuRiegler pour le script original.

Cela a fonctionné le 10.12.6 et est une modification mineure du script original (vu le commentaire de @ CharlieGorichanaz après avoir fait ma propre enquête):


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 Dans macOS 10.12.x, la barre d'outils contient uneentrez la description de l'image iciicônesupplémentaire enraison de laquelle l'ensemble de boutons (CPU, mémoire, énergie, etc.) se trouve à la group 2 of toolbar 1place degroup 1 of toolbar 1. En l'absence de cette icône (je n'ai pas confirmé dans les anciennes versions de macOS), je pense que les boutons du CPU, etc.group 1 of toolbar 1

** 2 Cela s'applique si vous avez déjà fait glisser la colonne PID de la colonne Activité vers une position différente. J'avais fait glisser la colonne PID vers la position la plus à gauche, donc sur cette ligne, j'ai dû changer l'index en1:

set pid to value of text field 1 of aProcess

Les colonnes sont numérotées à partir de l'extrême gauche, à partir de 1. Ajustez donc l'index en surbrillance dans la ligne ci-dessus en conséquence si nécessaire.

Ashutosh Jindal
la source