কোনও প্রক্রিয়া যদি প্রদত্ত পরিমাণের র‍্যামের চেয়ে বেশি হয় তবে স্বয়ংক্রিয়ভাবে কোনও প্রক্রিয়াটি মেরে ফেলুন


13

আমি বড় আকারের ডেটাসেটে কাজ করি। নতুন সফ্টওয়্যার পরীক্ষা করার সময়, কোনও স্ক্রিপ্ট মাঝে মাঝে আমার দিকে নজর রাখবে, দ্রুত সমস্ত উপলভ্য র‌্যাম ধরবে এবং আমার ডেস্কটপটিকে ব্যবহারযোগ্য নয় nder আমি কোনও প্রক্রিয়াটির জন্য একটি র‌্যাম সীমা নির্ধারণ করার উপায় চাই যাতে এটি যদি পরিমাণের বেশি হয় তবে এটি স্বয়ংক্রিয়ভাবে মারা যাবে। কোনও ভাষা-নির্দিষ্ট সমাধান সম্ভবত কার্যকর হবে না, কারণ আমি সমস্ত ধরণের বিভিন্ন সরঞ্জাম (আর, পার্ল, পাইথন, বাশ ইত্যাদি) ব্যবহার করি।

তাহলে কি এমন কোনও প্রসেস-মনিটর রয়েছে যা আমাকে একটি থ্রেশহোল্ড পরিমাণ সেট করতে দেবে এবং যদি আরও বেশি ব্যবহার করে তবে কোনও প্রক্রিয়া স্বয়ংক্রিয়ভাবে মেরে ফেলবে?



@ উরি: এই থ্রেডে আমি কেবলমাত্র একটি আংশিক পেয়েছি (কেবলমাত্র আমার প্রশ্নের সিপিইউ অংশের জন্য) - এবং অনুকূল নয় - উত্তর। তিনি র‌্যাম ব্যবহার সম্পর্কে জিজ্ঞাসা করেন।
ক্রিসকিন

1
উরি, সেই থ্রেডে দরকারী ধারণাগুলির সম্পূর্ণ অভাব রয়েছে। এটিতে একটি লিঙ্ক পোস্ট করা বিশেষভাবে সহায়ক নয়।
ক্রিসমিলার

1
- হুম এই সুপার-ইউজার থ্রেড ulimit ব্যবহার করে একটি যুক্তিসংগত পরামর্শ আছে বলে মনে হয়: superuser.com/questions/66383/restrict-ram-for-user-or-process
chrisamiller

উত্তর:


11

আমি তার নিজের প্রশ্নের উত্তরটি দেওয়া লোক হতে ঘৃণা করি, তবে আজ সকালে আমি একটি বিকল্প পদ্ধতি খুঁজে পেয়েছি, যা একটি দুর্দান্ত সামান্য উপযোগে আবৃত। এটি সিপিইউ সময় বা মেমরির খরচ সীমাবদ্ধ করবে:

https://github.com/pshved/timeout

আমি প্রথমে এইটিকে একটি শট দিচ্ছি তবে উত্তরের উত্তরের জন্য আমেয়াহকে আপলোড করছি। এটি যদি আমার ব্যর্থ হয় তবে আমি এটি যাচাই করব।


5
আপনার নিজের প্রশ্নের উত্তর দেওয়া ঠিক আছে !
টম ব্রসম্যান

10

আমি দৃ strongly়ভাবে এটি না করার পরামর্শ দেব । @ ক্রিসমিলারের পরামর্শ অনুসারে, ইউলিমিট সেট করা প্রক্রিয়া সহ র‌্যাম উপলভ্য করতে সীমাবদ্ধ করবে।

তবে এখনও যদি আপনি জেদ করছেন তবে এই পদ্ধতিটি অনুসরণ করুন।

  1. নিম্নলিখিত স্ক্রিপ্টটি সংরক্ষণ করুন killif.sh:

    #!/bin/sh
    
    if [ $# -ne 2 ];
    then
        echo "Invalid number of arguments"
        exit 0
    fi
    
    while true;
    do
        SIZE=$(pmap $1|grep total|grep -o "[0-9]*")
        SIZE=${SIZE%%K*}
        SIZEMB=$((SIZE/1024))
        echo "Process id =$1 Size = $SIZEMB MB"
        if [ $SIZEMB -gt $2 ]; then
            printf "SIZE has exceeded.\nKilling the process......"
            kill -9 "$1"
            echo "Killed the process"
            exit 0
        else
            echo "SIZE has not yet exceeding"
        fi
    
        sleep 10
    done
    
  2. এখন এটি কার্যকর করা।

    chmod +x killif.sh
    
  3. এখন এই স্ক্রিপ্টটি টার্মিনালে চালান। PROCIDপ্রকৃত প্রক্রিয়া আইডি এবং SIZEএমবি আকারের সাথে প্রতিস্থাপন করুন ।

    ./killif.sh PROCID SIZE
    

    উদাহরণ স্বরূপ:

    ./killif.sh 132451 100
    

    যদি SIZE100 হয় তবে এর র‌্যামের ব্যবহার 100 এমবি ছাড়িয়ে গেলে প্রক্রিয়াটি হত্যা করা হবে।

সাবধানতা: আপনি জানেন আপনি কী করার চেষ্টা করছেন। হত্যা প্রক্রিয়াটি ভাল ধারণা নয়। যদি সেই প্রক্রিয়াটির কোনও শাটডাউন বা স্টপ কমান্ড থাকে তবে স্ক্রিপ্টটি সম্পাদনা করুন এবং kill -9সেই shutdownআদেশের সাথে কমান্ডটি প্রতিস্থাপন করুন ।


আমি সেখানে খুব কম ঘুমানোর কথা বিবেচনা করব, উদাহরণস্বরূপ 0.5% ঘুমান ...
ডেনওয়ারকো

@ জর্জি এডিসন আপনি এটি কীভাবে করেছিলেন? আমি যখন পেস্ট করার চেষ্টা করেছি তখন এটি আমাকে অদ্ভুত বিন্যাসযুক্ত পাঠ্য দিচ্ছিল। ডেনওয়ারকো: আপনি কোথায় ঘুমাতে চান? আমি ইতিমধ্যে ওয়েল
লুপটিতে

2
সমাধানের জন্য ধন্যবাদ, নীচে উল্লিখিত হিসাবে, আমি এটি পরীক্ষা করে দেখতে পারি। কেন হত্যা প্রক্রিয়া সম্পর্কে সব ভয়াবহ সতর্কতা, যদিও? ক্লাস্টার ম্যানেজমেন্ট সফটওয়্যার (এলএসএফ, পিবিএস, এবং অন্যান্য) কোনও সময় কোনও প্রক্রিয়া দ্বারা অনুরোধ করা সংস্থার পরিমাণ ছাড়িয়ে যায়, এর কোনও মারাত্মক পরিণতি না হয়ে থাকে all আমি সম্মত হলাম যে এটি নতুন ব্যবহারকারীদের পক্ষে এটির সমাধানের পক্ষে ভাল সমাধান নয়, তবে সঠিক পরিস্থিতিতে এটি বেশ কার্যকর হতে পারে।
ক্রিসমিলার

@ ক্রিসমিলার আমি ভবিষ্যতের পাঠকদের জন্য একটি সতর্কতা রেখেছি। আপনার ক্ষেত্রে, আপনি প্রভাবগুলি জানেন তবে ভবিষ্যতে এই পোস্টটির পাঠক এই জাতীয় প্রভাব সম্পর্কে সচেতন হতে পারেন না।
আমে জে

2
কেন আপনি এটি বিশদভাবে ব্যাখ্যা করতে পারেন?
jterm

2

প্যাকেজ prlimitথেকে, সরঞ্জামটি ব্যবহার করে দেখুন util-linux। এটি সংস্থান সীমা সহ একটি প্রোগ্রাম চালায়। এটি prlimitসীমা নির্ধারণের জন্য সিস্টেম কল ব্যবহার করে , যা পরে কার্নেল দ্বারা বিশুদ্ধভাবে প্রয়োগ করা হয়।

আপনি 16 সীমাটি কনফিগার করতে পারেন, সহ:

  • সেকেন্ডে সর্বাধিক পরিমাণ সিপিইউ সময়
  • ব্যবহারকারী প্রক্রিয়া সর্বাধিক সংখ্যা
  • সর্বাধিক আবাসিক সেট আকার ("ব্যবহৃত স্মৃতি")
  • সর্বাধিক আকারের একটি প্রক্রিয়া মেমরিতে লক করতে পারে
  • ভার্চুয়াল মেমরি আকার
  • সর্বাধিক সংখ্যক খোলার ফাইল
  • ফাইল লক সংখ্যা
  • মুলতুবি থাকা সংকেতের সর্বাধিক সংখ্যা
  • POSIX বার্তা সারি সর্বাধিক বাইট

0

এটি একটি মন্তব্য ফিট করার জন্য খুব বড় ছিল। আমি একটি অন্তর্ভুক্ত করতে আমির মূল স্ক্রিপ্টটি সংশোধন করেছি pgrep, সুতরাং প্রক্রিয়া আইডিকে ম্যানুয়ালি প্রবেশ করার পরিবর্তে, আপনি কেবল নাম দ্বারা বাদ দিতে পারেন। উদাহরণস্বরূপ, ./killIf.sh chrome 4000মেমরির ব্যবহারে 4 গিগাবাইটের বেশি হওয়া কোনও ক্রোম প্রক্রিয়া মেরে ফেলে।

#!/bin/sh

# $1 is process name
# $2 is memory limit in MB

if [ $# -ne 2 ];
then
    echo "Invalid number of arguments"
    exit 0
fi

while true;
do
    pgrep "$1" | while read -r procId;
    do
        SIZE=$(pmap $procId | grep total | grep -o "[0-9]*")
        SIZE=${SIZE%%K*}
        SIZEMB=$((SIZE/1024))
        echo "Process id = $procId Size = $SIZEMB MB"
        if [ $SIZEMB -gt $2 ]; then
            printf "SIZE has exceeded.\nKilling the process......"
            kill -9 "$procId"
            echo "Killed the process"
            exit 0
        else
            echo "SIZE has not yet exceeding"
        fi
    done

    sleep 1
done

অযৌক্তিকভাবে অযৌক্তিক প্রক্রিয়াগুলিকে হত্যা না করার জন্য একটি সংকীর্ণ গ্রেপ স্ট্রিং এবং একটি বৃহত পর্যাপ্ত মেমরি সীমা নির্বাচন করতে সাবধান হন।

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