কোনও অ্যাপ্লিকেশন সাড়া না দিলে আমি কীভাবে তা নির্ধারণ করতে পারি?


11

আমার ওএসএক্সে একটি অ্যাপ্লিকেশন রয়েছে যা বারবার একটি প্রতিক্রিয়াবিহীন অবস্থায় যায় এবং জোর করে হত্যা করতে হয়। আমি এটি স্বয়ংক্রিয় করার আশা করছিলাম, তবে পিএস দিয়ে প্রক্রিয়াটি পরিদর্শন করার সময় আমি এমন কোনও কিছুই দেখতে পাচ্ছি না যা প্রতিক্রিয়া না জানিয়ে রাষ্ট্রের সাথে সাদৃশ্যপূর্ণ। আমি রাষ্ট্রের সূচকটির দিকে নজর রেখেছি , তবে অ্যাপটি এস হিসাবে দেখায় যে এটি প্রতিক্রিয়া করছে কিনা।

রাজ্য অক্ষরগুলির একটি ক্রম দ্বারা প্রদত্ত হয়, উদাহরণস্বরূপ, `W RWNA ''। প্রথম চরিত্রটি প্রক্রিয়াটির চলমান অবস্থা নির্দেশ করে:

  • আমি এমন একটি প্রক্রিয়া চিহ্নিত করি যা নিষ্ক্রিয় (প্রায় 20 সেকেন্ডের চেয়ে বেশি সময় ধরে ঘুমানো)।
  • একটি চলমান প্রক্রিয়া চিহ্নিত করে।
  • এস এমন একটি প্রক্রিয়া চিহ্নিত করে যা প্রায় 20 সেকেন্ডের চেয়ে কম ঘুমায় is
  • টি একটি থামানো প্রক্রিয়া চিহ্নিত করে।
  • ইউ নিরবচ্ছিন্ন অপেক্ষায় একটি প্রক্রিয়া চিহ্নিত করে।
  • জেড একটি মৃত প্রক্রিয়া চিহ্নিত করে (একটি `omb জম্বি '')।

ক্রিয়াকলাপ পরিচালকের মতো প্রক্রিয়াটি সাড়া দিচ্ছে না তা আমি কীভাবে নির্ধারণ করতে পারি ?


আমি অ্যাপলস্ক্রিপ্ট সমাধানগুলিতেও উন্মুক্ত।

উত্তর:


9

প্রতিক্রিয়া নয় এমন অবস্থা কোনও প্রক্রিয়া রাষ্ট্র নয়, বরং প্রক্রিয়াটি উইন্ডো ম্যানেজার / গ্রাফিকাল ইঞ্জিনের সাথে যোগাযোগ বন্ধ করে দিয়েছে। এটি একটি লুপে বেঁধে রাখা যেতে পারে, সকেটে ঝুলানো, দূরবর্তী ফাইল, এমন কোনও কিছু যা এটিকে মূল লুপে ফিরিয়ে রাখে যা ইভেন্টগুলি পরিচালনা করে। উইন্ডো ম্যানেজার নোটস ইভেন্টগুলি সারিবদ্ধ করা হচ্ছে এবং এইভাবে এটি "প্রতিক্রিয়া না করে" হিসাবে লেবেল করে

আপনার একটি ছোট এক্স 11 প্রোগ্রাম লিখতে হবে যা প্রক্রিয়ায় ডামি ইভেন্টগুলি প্রেরণ করে, তারপরে সাড়া না দিলে এটি হত্যা করুন।


সম্ভবত অ্যাপলস্ক্রিপ্টের সাথে এমন কিছু লেখা যা ইউআই স্তরের অ্যাক্সেস হিসাবে।
ম্যাথিউ রিগলার

@ ম্যাথিউইউ রিগেলার আপনি কীভাবে এটি অ্যাপলস্ক্রিপ্টে করবেন?
সি রস

আমি অন্য উত্তরে একটি উদাহরণ দিয়েছি।
ম্যাথিউ রিগলার

4

এখানে ইউআই স্ক্রিপ্টিং ব্যবহার করে এমন একটি অ্যাপলস্ক্রিপ্ট রয়েছে যা কোনও সাড়া না দেওয়ার প্রক্রিয়াটি অনুসন্ধান করে এবং তাদের হত্যা করে।

এটি মাভেরিক্সের ক্রিয়াকলাপ মনিটরের সাথে কাজ করবে। তবে যেহেতু এটি ইউআই স্ক্রিপ্টিং এবং ক্রিয়াকলাপ মনিটরের ইউআই পরিবর্তিত হয়েছে, সম্ভবত এটি সামান্য পরিবর্তন ছাড়াই পুরানো ওএস এক্স এর সাথে কাজ করবে না।

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। আমি এটি সরিয়ে দিয়েছি এবং অন্য কিছু স্টাফ ট্যুইক করেছি (আমি কেবল একটি নির্দিষ্ট প্রোগ্রামটি হত্যা করতে চাই) এবং রানটাইম ত্রুটি পেতে পারি: 'ত্রুটি "সিস্টেম ইভেন্টগুলি ত্রুটি পেয়েছে: সহায়ক ডিভাইসের অ্যাক্সেস অক্ষম করা হয়েছে।" প্রক্রিয়া "ক্রিয়াকলাপ মনিটর" এর উইন্ডো 1 থেকে নম্বর -1719
সি। রস

ওএসএক্স ম্যাভেরিক্সে কি সেই স্ক্রিপ্টটি চালানো হয়েছে?
ম্যাথিউ রিগলার

ওএসএক্স 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

(কোনও মন্তব্যে ফিট করার জন্য এটি দীর্ঘ সময় থেকে আলাদা উত্তর হিসাবে পোস্ট করা)

আসল স্ক্রিপ্টের জন্য @ ম্যাথিউইউরেগলারে ক্রেডিট

এটি 10.12.6 এ কাজ করেছে এবং এটি মূল স্ক্রিপ্টের একটি সামান্য পরিবর্তন (@ আমার নিজের তদন্ত শেষ করার পরে @ চার্লিগোরিচানজের মন্তব্য দেখুন):


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 ম্যাকোএস 10.12.x এ, সরঞ্জামদণ্ডে একটি অতিরিক্তএখানে চিত্র বর্ণনা লিখুনআইকনরয়েছেযার কারণে বোতামগুলির সেট (সিপিইউ, মেমরি, শক্তি ইত্যাদি) এর group 2 of toolbar 1পরিবর্তে রয়েছেgroup 1 of toolbar 1। এই আইকনের অনুপস্থিতিতে (আমি পুরানো ম্যাকোস সংস্করণগুলিতে নিশ্চিত নই), আমার বিশ্বাস সিপিইউ ইত্যাদির বোতামগুলি থাকবেgroup 1 of toolbar 1

** 2 আপনি যদি ক্রিয়াকলাপের পিআইডি কলামটিকে কোনও আলাদা অবস্থানে টেনে নিয়ে থাকেন তবে এটি প্রয়োগ হয়। আমি এই লাইনে পিআইডি কলামটি বামতম অবস্থানে টেনে নিয়েছি, আমাকে সূচকটি এখানে পরিবর্তন করতে হয়েছিল1:

set pid to value of text field 1 of aProcess

কলামগুলি বামদিক থেকে শুরু করা হয়েছে, ১ থেকে শুরু করে So

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.