সিপিইউ / মেমরির ব্যবহার খুব বেশি হলে স্বয়ংক্রিয়ভাবে প্রক্রিয়াগুলিকে মেরে ফেলা বাশ স্ক্রিপ্ট


11

আমি একটি স্ক্রিপ্ট তৈরি করেছি যা সিপিইউ এবং / অথবা মেমরির ব্যবহার 80% হিট করে তবে প্রক্রিয়াগুলিকে হত্যা করে। এটি ঘটে গেলে নিহত প্রক্রিয়াগুলির একটি তালিকা তৈরি করে। আমি এটির উন্নতি করতে কী করতে পারি?

while [ 1 ];
do 
echo
echo checking for run-away process ...

CPU_USAGE=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_USAGE_THRESHOLD=800
PROCESS=$(ps aux r)
TOPPROCESS=$(ps -eo pid -eo pcpu -eo command | sort -k 2 -r | grep -v PID | head -n 1)

if [ $CPU_USAGE -gt $CPU_USAGE_THRESHOLD] ; then
  kill -9 $(ps -eo pid | sort -k 1 -r | grep -v PID | head -n 1) #original
  kill -9 $(ps -eo pcpu | sort -k 1 -r | grep -v %CPU | head -n 1)
  kill -9 $TOPPROCESS
  echo system overloading!
  echo Top-most process killed $TOPPROCESS
      echo CPU USAGE is at $CPU_LOAD

else
    fi
    exit 0
    sleep 1;
    done

3
আপনি কি স্ক্রিপ্ট চালানোর চেষ্টা করেছেন? while [ 1 ]এই স্ক্রিপ্টটি একা কতটা সিপিইউ গ্রহণ করবে তা আমাকে অবাক করে দেয়। এছাড়াও, kill -9একটি স্ক্রিপ্টে নিয়মিত 3 টি কল আসে ? এটি আমাকে
শীতল

1
যাইহোক ভাল অবতার, @ রহমু সে sleep 1লুপে পেয়েছে
ডেইজি

1
মাসের প্রথম সোমবার এবং আমার পিসি একটি (ধীর) RAID6 সেট পরীক্ষা করছে। সিপিইউ লোডটি সহজেই 8 এর উপরে পৌঁছে যায় কারণ এটি এই রেড সেট থেকে নিয়মিত ডিস্ক আইওয়ের জন্য অপেক্ষা করে। কিছুই ভুল, সিস্টেম এখনও খুব প্রতিক্রিয়াশীল। আপনার স্ক্রিপ্টটি আমার ফায়ারফক্সকে হত্যা করবে যা উপলব্ধ 400% এর মাত্র 3.6% ব্যবহার করে। এই স্ক্রিপ্টটি দিয়ে আপনি কেবল ভূতের শিকার করতে চলেছেন বলছেন। বিটিডাব্লু: উচ্চ লোডের কারণে আপনার সিস্টেমটি ক্ষতিগ্রস্থ হবে না এবং যখন স্মৃতিশক্তি ফুরিয়ে যায়, কার্নেলটি একটি প্রক্রিয়া (এস) কে কীভাবে হত্যা করবে সে সম্পর্কে অর্ধশিক্ষিত অনুমান করবে।
জিপ্পি

তাহলে বেসড লোডের উপর ভিত্তি করে হত্যা প্রক্রিয়া ঠিক হবে না ????
কেতন প্যাটেল

আমার ব্যবহারের ক্ষেত্রে হত্যাকাণ্ড কাঙ্ক্ষিত নয়।
জিপ্পি

উত্তর:


11

আপনি যে সমস্যার সমাধান করতে চান তা অনুমান করছি যে আপনার বাক্সে এমন কিছু প্রক্রিয়া চলছে যা কখনও কখনও দুর্ব্যবহার করে এবং চিরকালের জন্য একটি মূল পেগিং করে বসে।

আপনি প্রথমটি যা করতে চান তা হ'ল উন্মাদ হয়ে যাওয়া প্রোগ্রামটি ঠিক করার চেষ্টা করা। এটি এখন পর্যন্ত সেরা সমাধান। আমি ধরে নিচ্ছি যে এটি সম্ভব নয়, বা আপনার বাক্সটি ঠিক না হওয়া অবধি চালিয়ে রাখতে আপনার একটি দ্রুত ক্লুজ প্রয়োজন।

আপনি, ন্যূনতমভাবে, আপনার স্ক্রিপ্টটি কেবলমাত্র সেই সম্পর্কিত একটি প্রোগ্রামে সীমাবদ্ধ করতে চান যা আপনি উদ্বিগ্ন। অনুমতিগুলি যদি আপনার স্ক্রিপ্টটিকে এভাবে সীমাবদ্ধ করে রাখে তবে তা সর্বোত্তম হবে (যেমন, আপনার স্ক্রিপ্টটি এক্স এক্স হিসাবে চালিত হয়, এক্স হিসাবে চলমান কেবলমাত্র অন্য জিনিসটি প্রোগ্রামটি))

এমনকি ulimit -tসিপিইউর যে পরিমাণ সময় প্রোগ্রামটি ব্যবহার করতে পারে তার পরিমাণ সীমাবদ্ধ করার মতো কিছু ব্যবহার করা আরও ভাল । একইভাবে, যদি এটি সমস্ত স্মৃতি গ্রহণ করে তবে চেক করুন ulimit -v। কার্নেল এই সীমাগুলি প্রয়োগ করে; bashবিশদটির জন্য ম্যানপেজ (এটি একটি অন্তর্নির্মিত শেল) এবং setrlimit(2)ম্যানপেজ দেখুন।

যদি সমস্যাটি আমোক চলমান প্রক্রিয়া না হয় তবে এর পরিবর্তে কেবলমাত্র অনেকগুলি প্রক্রিয়া চলমান থাকে, তবে এক্স এর চেয়ে বেশি চালানো থেকে রক্ষা পেতে কিছুটা লক প্রয়োগ করুন (বা — এটি পরিচিত হওয়া উচিত — ulimit -u)। আপনি সেই প্রক্রিয়াগুলির (সিলেক্টর ) niceবা পূর্বনির্ধারিত অগ্রাধিকারটি পরিবর্তন করতে reniceবা ব্যবহারের sched_setschedulerনীতিটি পরিবর্তন করতেও বিবেচনা করতে পারেন SCHED_IDLE

আপনার যদি আরও বেশি নিয়ন্ত্রণের প্রয়োজন হয় তবে একটি কন্ট্রোল গ্রুপ (সিগ্রুপ) দেখুন। আপনি যে কার্নেলটি চালাচ্ছেন তার উপর নির্ভর করে আপনি সিপিইউ সময়, মেমরি, আই / ও, ইত্যাদির পরিমাণ সীমাবদ্ধ করতে পারেন যা পুরো গোষ্ঠী একসাথে প্রক্রিয়াজাত করে। নিয়ন্ত্রণ গ্রুপগুলি বেশ নমনীয়; কোনও ভঙ্গুর ক্লুজেজ ছাড়াই তারা সম্ভবত আপনি যা করার চেষ্টা করছেন তা করতে পারে। আরআর লিনাক্স উইকির সিগ্রুপগুলির জন্য একটি ভূমিকা রয়েছে যা পড়ার মতো, যেমন এলডাব্লুএন-এর নীল ব্রাউনয়ের সিগ্রুপ সিরিজ


3

সমস্যা:

  • যখন সাংখ্যিক ক্ষেত্র বাছাই আপনি সম্ভবত ব্যবহার করতে চান -nবিকল্প: sort -nrk 2। অন্যথায় %CPU5.0 মানের একটি লাইন 12.0 মানের সাথে একের বেশি শেষ হবে।
  • আপনার psপ্রয়োগের উপর নির্ভর করে আপনি এ --no-headersথেকে মুক্তি পেতে বিকল্পটি ব্যবহার করতে চাইতে পারেন grep -v। এটি আপনাকে ধারণ করে এমন কমান্ডগুলি বাতিল করতে বাধা দেয় PID
  • আমার পরিবর্তে অনুমান echo CPU USAGE is at $CPU_LOAD, আপনি বলতে চেয়েছিলেন echo CPU USAGE is at $CPU_USAGE
  • আমি অনুমান করি exit 0যে আপনি ডিবাগিংয়ের সময় that োকানো যা সরিয়ে দিতে ভুলে গেছেন (?)

শৈলী:

  • আপনি CPU_USAGE_THRESHOLD=800ফাইলটির শুরুতে লাইনটি সরিয়ে নিতে চাইতে পারেন , এটি এটি সবচেয়ে তথ্যবহুল বিষয় এবং এটি সম্ভবত আপনার স্ক্রিপ্ট স্থিতিশীল হওয়ার পরেও পরিবর্তিত হতে পারে।
  • আপনি -eবিকল্পটি পুনরাবৃত্তি করছেন : (যেমন রয়েছে ) ps -eo pid -eo pcpu -eo commandএকই ।ps -eo pid -o pcpu -o commandps -eo pid,pcpu,command
  • একটি খালি elseধারা আছে। এটি সর্বদা দেখে মনে হয় যেন এটি পরিচালনা করা উচিত তবে এটি কোনও অজানা কারণে নয়।

2

বেশিরভাগ সিপিইউ / মেমরি ব্যবহার করা প্রক্রিয়াগুলিকে হত্যা করা সমস্যার জন্য জিজ্ঞাসা করছে: আপনার মেশিনে এখন তারা কী রয়েছে তা দেখুন (এখানে বর্তমানে ফায়ারফক্স, সিস্টেমড (ইনি)), জর্গ, জিনোম-টার্মিনাল, কার্নেল থ্রেডের একটি সেট, জেম্যাকস; যার কোনটিই ডিসপেনসেবল)। উদাহরণস্বরূপ, এখানে লিনাক্সের ওওএম-কিলারটিকে কীভাবে টুইট করা যায় তা দেখুন ।

এছাড়াও মনে রাখবেন যে "প্রক্রিয়া দ্বারা ব্যবহৃত স্মৃতি" একটি নেবুলাস ধারণা, কারণ এখানে ভাগ করা লাইব্রেরি রয়েছে, এক্সিকিউটেবলগুলি ভাগ করা হয় এবং এমনকি ডেটা ক্ষেত্রের কিছু অংশ। প্রতিটি ব্যবহারকারীর জন্য ব্যবহৃত জায়গার ভগ্নাংশের জন্য চার্জ দিয়ে কিছু সংখ্যক উপস্থিত হতে পারে, তবে এমনকি যুক্ত করে যে সত্যই "ব্যবহৃত মেমরি" দেয় না (এমনকি "প্রক্রিয়া চলে গেলে মেমরি মুক্ত হয় না") অংশগুলি ভাগ করে নেওয়া পিছনে)।


1

আমি একটি স্ক্রিপ্ট তৈরি করেছি, কিল-প্রসেস , এটি অ্যারেতে তালিকাবদ্ধ কিছু প্রক্রিয়াগুলিকে মেরে ফেলবে , যদি সিপিইউ ব্যবহারটি ওয়াইওয়াই সেকেন্ডের জন্য XX% এর চেয়ে বেশি হয় বা জেডজেড সেকেন্ডের চেয়ে বেশি চলমান প্রক্রিয়াগুলিকে হত্যা করে।

  • আপনি ফাইলের শীর্ষে XX, YY, ZZ সেট করতে পারেন।
  • আপনি চেক প্রক্রিয়া জন্য একটি পিএস বা শীর্ষ ব্যবহার করতে পারেন।
  • একটি শুকনো রান মোডও আছে, পরীক্ষা করার জন্য কিন্তু হত্যা না করে।
  • শেষ পর্যন্ত, কিছু প্রক্রিয়া মারা গেলে স্ক্রিপ্টটি একটি ইমেল প্রেরণ করে।

দ্রষ্টব্য: এখানে গিথুবে আমার রেপো রয়েছে: https://github.com/padosoft/kill-process

এখানে একটি স্ক্রিনশট:

         SS # 1

তথ্যসূত্র

স্ক্রিপ্টের প্রয়োজনীয় অংশ (শীর্ষ কমান্ডের জন্য একটি কোড বিমূর্ত):

#!/usr/bin/env bash

#max cpu % load
MAX_CPU=90
#max execution time for CPU percentage > MAX_CPU (in seconds 7200s=2h)
MAX_SEC=1800
#sort by cpu
SORTBY=9

#define a processes command name to check
declare -a KILLLIST
KILLLIST=("/usr/sbin/apache2" "/usr/bin/php5-cgi")

#iterate for each process to check in list
for PROCESS_TOCHECK in ${KILLLIST[*]}
do

    #retrive pid with top command order by SORTBY
    PID=$(top -bcSH -n 1 | grep $PROCESS_TOCHECK | sort -k $SORTBY -r | head -n 1 | awk '{print $1}')

    CPU=$(top -p $PID -bcSH -n 1 | grep $PROCESS_TOCHECK | sort -k $SORTBY -r | head -n 1 | awk '{print $9}')
    TIME_STR=$(top -p $PID -bcSH -n 1 | grep $PROCESS_TOCHECK | sort -k $SORTBY -r | head -n 1 | awk '{print $11}')

    # Decode the top CPU time format [dd-]hh:mm.ss.
    TIME_SEC=0
    IFS="-:" read c1 c2 c3 c4 <<< "$TIME_STR"

    #with top command time format is hh:mm.ss, so truncare seconds in c2
    c2=${c2%%.*}

    if [ -n "$c4" ]
    then
      TIME_SEC=$((10#$c4+60*(10#$c3+60*(10#$c2+24*10#$c1))))
    elif [ -n "$c3" ]
    then
      if [ "$CMD" = "ps" ]; then
        TIME_SEC=$((10#$c3+60*(10#$c2+60*10#$c1)))
      else
        TIME_SEC=$(((10#$c3*24)*60*60)+60*(10#$c2+60*10#$c1))             
      fi   
    else
      if [ "$CMD" = "ps" ]; then
        TIME_SEC=$((10#0+(10#$c2+60*10#$c1)))
      else
        TIME_SEC=$((10#0+60*(10#$c2+60*10#$c1)))
      fi
    fi

    #check if need to kill process
    if [ $CPU -gt $MAX_CPU ] && [ $TIME_SEC -gt $MAX_SEC ]; then
        kill -15 $PID
    fi

done
ব্যবহার:
bash killprocess.sh [dry|kill|--help] [top|ps] [cpu|time]

মনে sortহওয়া উচিত sort -k9nr। ছাড়া n, পাবেন `5.9`> 29.4
lk_vc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.