Bir uygulamanın yanıt vermediğini nasıl belirleyebilirim?


11

OSX üzerinde defalarca Yanıt Vermeyen duruma giren ve zorla öldürülmesi gereken bir uygulamam var. Otomatikleştirmeyi umuyordum, ancak ps ile süreci incelerken Yanıt Vermiyor durumuna karşılık gelen hiçbir şey görmüyorum. Durum göstergesine baktım , ancak uygulama yanıt verip vermediğini S olarak gösteriyor .

durum Durum, bir dizi karakterle verilir, örneğin `` RWNA ''. İlk karakter, işlemin çalışma durumunu gösterir:

  • I Boşta olan bir işlemi işaretler (yaklaşık 20 saniyeden daha uzun süre uykuda).
  • R Çalıştırılabilir bir işlemi işaretler.
  • S Yaklaşık 20 saniyeden daha az bir süre uyuyan bir işlemi işaretler.
  • T Durdurulmuş bir işlemi işaretler.
  • U Bir işlemi kesintisiz beklemede işaretler.
  • Z Ölü bir süreci işaretler (bir `` zombi '').

İşlemin Etkinlik Yöneticisi'nin yaptığı gibi Yanıt Vermediğini nasıl belirleyebilirim ?


AppleScript çözümlerine de açığım.

Yanıtlar:


9

Yanıt Vermiyor durumu bir işlem durumu değil, daha çok işlem pencere yöneticisi / grafik altyapısıyla iletişim kurmayı durdurdu. Bir döngüye bağlanabilir, bir sokete, uzak dosyaya, olayları işleyen ana döngüye geri dönmesini sağlayan herhangi bir şeye asılabilir. Pencere yöneticisi olayların kuyruğa alındığını fark eder ve böylece "Yanıt vermiyor" olarak etiketler

Sürece kukla olaylar gönderen küçük bir X11 programı yazmanız ve ardından yanıt vermezse öldürmeniz gerekebilir.


Belki AppleScript ile UI seviyesi erişimi olan bir şey yazmak.
Matthieu Riegler

@MatthieuRiegler AppleScript'te bunu nasıl yapardınız?
C. Ross

Başka bir cevapta bir örnek verdim.
Matthieu Riegler

4

Yanıt vermeyen bir süreç arayan ve onları öldüren UI komut dosyası kullanan bir AppleScript.

Mavericks'in Etkinlik Monitörü ile çalışacaktır. Ancak bu, kullanıcı arabirimi komut dosyası oluşturma ve Etkinlik İzleyicisi'nin kullanıcı arayüzü değiştiği için, büyük değişiklikler olmadan eski OS X ile çalışmayacaktır.

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

Hatta derleme hatası alıyorum tell radio button 1 of radio. Bunu kaldırdım ve diğer bazı şeyleri ayarladım (yalnızca belirli bir programı öldürmek istiyorum) ve çalışma zamanı hatası alıyorum: 'hata "Sistem Olayları'nda bir hata var: Yardımcı cihazlara erişim devre dışı." "Etkinlik Monitörü" sürecinin 1. penceresinden -1719 sayısı
C. Ross

O betiği OSX Mavericks'te çalıştırdı mı?
Matthieu Riegler

OSX 10.8, yani hayır.
C. Ross

olarak değiştirdikten sonra 10.12.5 üzerinde çalıştıtell radio button 1 of radio group 1 of group 2 of toolbar 1 of window 1 to click
Charlie Gorichanaz

0

(Bir yoruma sığmayacak kadar uzun zamandan beri bunu ayrı bir yanıt olarak yayınlamak)

Orijinal komut dosyası için @MatthieuRiegler'a teşekkür ederiz.

Bu 10.12.6 üzerinde çalıştı ve orijinal senaryoda küçük bir değişiklik yapıldı (kendi araştırmamı yaptıktan sonra @ CharlieGorichanaz'ın yorumunu gördüm):


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 macOS 10.12.x'te, araç çubuğundaresim açıklamasını buraya girindüğme kümesi (CPU, Bellek, Enerji vb.)Yerine ek birsimge group 2 of toolbar 1bulunurgroup 1 of toolbar 1. Bu simgenin yokluğunda (eski macOS sürümlerinde onaylamadım), CPU vb düğmeleriningroup 1 of toolbar 1

** 2 Bu, Etkinlik sütunundaki PID sütununu farklı bir konuma sürüklediyseniz geçerlidir. PID sütununu en soldaki konuma sürükledim, bu yüzden bu satırda dizini değiştirmek zorunda kaldım1:

set pid to value of text field 1 of aProcess

Sütunlar, 1'den başlayarak en soldan numaralandırılır. Bu nedenle, gerekirse yukarıdaki satırda vurgulanan dizini ayarlayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.