Bagaimana saya bisa menentukan apakah suatu aplikasi tidak merespons?

11

Saya memiliki aplikasi di OSX yang berulang kali masuk ke status Tidak Menanggapi dan harus dibunuh paksa. Saya berharap untuk mengotomatisasi itu, tetapi ketika memeriksa proses dengan ps saya tidak melihat apa pun yang sesuai dengan keadaan Tidak Menanggapi. Saya melihat indikator status , tetapi aplikasi menunjukkan sebagai S apakah merespons atau tidak.

state Status diberikan oleh urutan karakter, misalnya, `` RWNA ''. Karakter pertama menunjukkan proses proses:

  • Saya Menandai proses yang tidak digunakan (tidur lebih dari 20 detik).
  • R Menandai proses yang bisa dijalankan.
  • S Menandai proses yang tidur kurang dari sekitar 20 detik.
  • T Menandai proses yang terhenti.
  • U Menandai proses dalam menunggu tanpa gangguan.
  • Z Menandai proses mati (a `` zombie '').

Bagaimana saya bisa menentukan apakah prosesnya tidak merespons seperti yang dilakukan oleh Activity Manager?


Saya juga terbuka untuk solusi AppleScript.

C. Ross
sumber

Jawaban:

9

Keadaan Tidak Menanggapi bukan keadaan proses, melainkan proses telah berhenti berkomunikasi dengan manajer jendela / mesin grafis. Itu bisa diikat dalam satu lingkaran, tergantung pada soket, file jarak jauh, apa pun yang membuatnya kembali ke loop utama yang menangani acara. Window manager melihat acara sedang antri dan karenanya menandainya sebagai "Tidak merespons"

Anda mungkin perlu menulis program X11 kecil yang mengirimkan acara dummy ke proses, lalu matikan jika tidak merespons.

JVO
sumber
Mungkin menulis sesuatu dengan AppleScript yang sebagai akses tingkat UI.
Matthieu Riegler
@ MatthieuRiegler Bagaimana Anda melakukannya di AppleScript?
C. Ross
Saya memberikan contoh dalam jawaban lain.
Matthieu Riegler
4

Berikut ini adalah AppleScript menggunakan skrip UI yang mencari proses yang tidak merespons dan membunuhnya.

Ini akan bekerja dengan Monitor Aktivitas Mavericks. Tetapi karena ini adalah skrip UI dan karena UI Monitor Aktivitas berubah, ini kemungkinan besar tidak akan bekerja dengan OS X yang lebih lama tanpa beberapa modifikasi kecil.

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
sumber
Saya mendapatkan kesalahan kompilasi di telepon tell radio button 1 of radio. Saya menghapusnya dan men-tweak beberapa hal lain (saya hanya ingin mematikan program tertentu) dan mendapatkan error runtime: 'error "System Events mendapat kesalahan: Akses untuk perangkat bantu dinonaktifkan." nomor -1719 dari jendela 1 proses "Monitor Aktivitas" '
C. Ross
Apakah menjalankan skrip itu di OSX Mavericks?
Matthieu Riegler
OSX 10.8, jadi tidak.
C. Ross
bekerja pada 10.12.5 setelah berganti ketell radio button 1 of radio group 1 of group 2 of toolbar 1 of window 1 to click
Charlie Gorichanaz
0

(Posting ini sebagai jawaban terpisah karena terlalu lama untuk dimasukkan dalam komentar)

Kredit ke @MatthieuRiegler untuk skrip asli.

Ini berfungsi pada 10.12.6 dan merupakan modifikasi kecil dari skrip asli (lihat komentar @ CharlieGorichanaz setelah saya melakukan penyelidikan sendiri):


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 Dalam macOS 10.12.x, bilah alat berisimasukkan deskripsi gambar di siniikontambahanyang digunakangroup 2 of toolbar 1sebagai gantirangkaian tombol (CPU, Memori, Energi, dll.) group 1 of toolbar 1. Dengan tidak adanya ikon itu (saya belum mengkonfirmasi dalam versi macOS yang lebih lama), saya percaya tombol CPU dll akan masukgroup 1 of toolbar 1

** 2 Ini berlaku jika Anda pernah menyeret kolom PID di kolom Activity ke posisi yang berbeda. Saya telah menyeret kolom PID ke posisi paling kiri sehingga pada baris ini, saya harus mengubah indeks ke1:

set pid to value of text field 1 of aProcess

Kolom diberi nomor dari paling kiri, mulai dari 1. Jadi, sesuaikan indeks yang disorot di baris di atas sesuai jika diperlukan.

Ashutosh Jindal
sumber