यदि कोई एप्लिकेशन जवाब नहीं दे रहा है तो मैं कैसे निर्धारित कर सकता हूं?


11

मेरे पास OSX पर एक एप्लिकेशन है जो बार-बार नॉट रिस्पॉन्सिंग स्टेट में जाता है और उसे मारना पड़ता है। मैं इसे स्वचालित करने की उम्मीद कर रहा था, लेकिन जब पीएस के साथ प्रक्रिया का निरीक्षण कर रहा हूं तो मुझे ऐसा कुछ भी दिखाई नहीं दे रहा है जो नॉट रिस्पॉन्सिंग स्टेट से मेल खाता हो। मैंने राज्य संकेतक को देखा , लेकिन ऐप एस के रूप में दिखाता है कि यह प्रतिक्रिया दे रहा है या नहीं।

राज्य वर्णों के अनुक्रम द्वारा दिया जाता है, उदाहरण के लिए, `` RWNA '। पहला वर्ण प्रक्रिया की रन स्थिति को इंगित करता है:

  • मैं एक ऐसी प्रक्रिया को चिह्नित करता हूं जो निष्क्रिय है (लगभग 20 सेकंड से अधिक समय तक सो रही है)।
  • आर एक चल प्रक्रिया है।
  • एस एक ऐसी प्रक्रिया को चिह्नित करता है जो लगभग 20 सेकंड से कम समय के लिए सो रही है।
  • T एक रुकी हुई प्रक्रिया को चिह्नित करता है।
  • यू अबाधित प्रतीक्षा में एक प्रक्रिया को चिह्नित करता है।
  • जेड एक मृत प्रक्रिया (एक `` ज़ोंबी '')।

यदि प्रक्रिया प्रबंधक की प्रतिक्रिया नहीं है तो मैं कैसे निर्धारित कर सकता हूं ?


मैं AppleScript समाधानों के लिए भी खुला हूं।

जवाबों:


9

नॉट रिस्पॉन्डिंग स्टेट एक प्रोसेस स्टेट नहीं है, बल्कि विंडो मैनेजर / ग्राफिकल इंजन के साथ प्रोसेस को कम करना बंद कर दिया गया है। इसे एक लूप में बांधा जा सकता है, एक सॉकेट, रिमोट फाइल पर लटका दिया जा सकता है, कुछ भी जो इसे मुख्य लूप पर वापस रखता है जो घटनाओं को संभालता है। विंडो प्रबंधक नोटिस घटनाओं को कतारबद्ध किया जा रहा है और इस प्रकार इसे "जवाब नहीं" के रूप में लेबल किया गया है

आपको एक छोटा सा X11 प्रोग्राम लिखने की आवश्यकता हो सकती है जो प्रक्रिया में डमी घटनाओं को भेजता है, फिर इसे मारें यदि यह प्रतिक्रिया नहीं करता है।


शायद AppleScript के साथ कुछ लिख रहा है कि UI स्तर पहुंच के रूप में।
मैथ्यू रीगलर

@ MatthieuRiegler आप AppleScript में ऐसा कैसे करेंगे?
C. रॉस

मैंने एक अन्य उत्तर में एक उदाहरण प्रदान किया।
मैथ्यू रीगलर

4

यहां UI स्क्रिप्टिंग का उपयोग करने वाला एक AppleScript है जो प्रतिक्रिया नहीं देने वाली प्रक्रिया की तलाश करता है और उन्हें मारता है।

यह Mavericks के गतिविधि मॉनिटर के साथ काम करेगा। लेकिन चूंकि यह यूआई स्क्रिप्टिंग है और जब से एक्टिविटी मॉनिटर के यूआई में बदलाव आया है, यह संभवतः कुछ मामूली संशोधनों के बिना पुराने ओएस एक्स के साथ काम नहीं करेगा।

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

मुझे लाइन पर एक संकलित त्रुटि मिलती है tell radio button 1 of radio। मैंने वह हटा दिया और कुछ अन्य सामान को बदल दिया (मैं केवल एक विशिष्ट कार्यक्रम को मारना चाहता हूं) और रनटाइम त्रुटि प्राप्त करता हूं: 'त्रुटि "सिस्टम ईवेंट को एक त्रुटि मिली: सहायक उपकरणों के लिए पहुंच अक्षम है।" संख्या -1719 प्रक्रिया 1 की विंडो 1 से "एक्टिविटी मॉनिटर"
सी। रॉस

OSX Mavericks पर उस स्क्रिप्ट को चलाया?
Matthieu Riegler

OSX 10.8, इसलिए नहीं।
सी। रॉस

10.12.5 को बदलने के बाद काम कियाtell radio button 1 of radio group 1 of group 2 of toolbar 1 of window 1 to click
चार्ली गोरीचानाज़

0

(एक टिप्पणी में फिट होने के लिए बहुत लंबे समय से एक अलग उत्तर के रूप में इसे पोस्ट करना)

मूल स्क्रिप्ट के लिए @MatthieuRiegler को श्रेय।

यह १०.१२.६ पर काम किया और मूल स्क्रिप्ट का एक मामूली संशोधन है (मैंने अपनी जाँच करने के बाद @ चार्लीगोरिखानज़ की टिप्पणी देखी):


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 में, टूलबार में एक अतिरिक्तयहाँ छवि विवरण दर्ज करेंआइकन होता है, जिसके कारण बटन (CPU, मेमोरी, एनर्जी, आदि) का सेट group 2 of toolbar 1इसके बजाय होता हैgroup 1 of toolbar 1। उस आइकन की अनुपस्थिति में (मैंने पुराने macOS संस्करणों में पुष्टि नहीं की है), मेरा मानना ​​है कि सीपीयू आदि बटन अंदर होंगेgroup 1 of toolbar 1

** 2 यह लागू होता है यदि आपने कभी गतिविधि कॉलम में PID कॉलम को किसी अन्य स्थिति में खींच लिया है। मैंने इस पंक्ति पर PID कॉलम को सबसे बाईं ओर खींच लिया है, इसलिए मुझे सूचकांक बदलना पड़ा1:

set pid to value of text field 1 of aProcess

स्तंभों को बाईं ओर से क्रमांकित किया गया है, 1 से शुरू होता है। इसलिए यदि आवश्यक हो तो तदनुसार हाइलाइट किए गए सूचकांक को उपरोक्त पंक्ति में समायोजित करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.