यदि यह किसी रैम की मात्रा से अधिक है तो स्वचालित रूप से एक प्रक्रिया को मार दें


13

मैं बड़े पैमाने पर डेटासेट पर काम करता हूं। नए सॉफ्टवेयर का परीक्षण करते समय, एक स्क्रिप्ट कभी-कभी मुझ पर चुपके ले जाएगी, जल्दी से सभी उपलब्ध रैम को पकड़ लेगी, और मेरे डेस्कटॉप को बेकार कर देगी। मैं एक प्रक्रिया के लिए एक रैम सीमा निर्धारित करने का एक तरीका चाहूंगा ताकि अगर यह उस राशि से अधिक हो जाए, तो यह स्वचालित रूप से मारा जाएगा। एक भाषा-विशिष्ट समाधान शायद काम नहीं करेगा, क्योंकि मैं सभी प्रकार के विभिन्न उपकरणों (आर, पर्ल, पायथन, बैश, आदि) का उपयोग करता हूं।

तो क्या कुछ प्रक्रिया-मॉनीटर है जो मुझे रैम की सीमा निर्धारित करने देगा और यदि यह अधिक उपयोग करता है तो स्वचालित रूप से एक प्रक्रिया को मार देगा?



@ उरी: उस धागे पर मुझे केवल एक आंशिक (मेरे प्रश्न के सीपीयू भाग के लिए) मिला - और इष्टतम नहीं - उत्तर। वह रैम के उपयोग के बारे में पूछता है।
क्रिस्किन

1
उरी, उस सूत्र में उपयोगी विचारों की पूरी कमी है। इसके लिए एक लिंक पोस्ट करना विशेष रूप से उपयोगी नहीं है।
क्रिसमिलर

जवाबों:


11

मैं उस आदमी से नफरत करता हूं जो अपने सवाल का जवाब देता है, लेकिन आज सुबह मुझे एक वैकल्पिक तरीका मिला, जो एक छोटी सी उपयोगिता में लिपटा हुआ था। यह CPU समय या मेमोरी खपत को सीमित करेगा:

https://github.com/pshved/timeout

मैं इस एक शॉट पहले दे रहा हूँ, लेकिन अच्छा जवाब के लिए अमेय जाह को upvotes। यदि यह मुझे विफल होता है तो मैं इसकी जाँच करूँगा।


5
+1 आपके अपने प्रश्न का उत्तर देना ठीक है !
टॉम ब्रॉसमैन

10

मैं दृढ़ता से सलाह दूंगा कि ऐसा न करें । जैसा कि @chrisamiller ने सुझाव दिया है, अलिमेट सेट करने से प्रक्रिया के साथ उपलब्ध RAM सीमित हो जाएगी।

लेकिन फिर भी अगर आप जिद कर रहे हैं तो इस प्रक्रिया का पालन करें।

  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. अब इस स्क्रिप्ट को टर्मिनल पर चलाएँ। MB में PROCIDवास्तविक प्रक्रिया आईडी और SIZEआकार के साथ बदलें ।

    ./killif.sh PROCID SIZE
    

    उदाहरण के लिए:

    ./killif.sh 132451 100
    

    यदि SIZE100 है तो इसकी प्रक्रिया को मार दिया जाएगा यदि इसका रैम उपयोग 100 एमबी से अधिक हो जाता है।

सावधानी: आप जानते हैं कि आप क्या करने की कोशिश कर रहे हैं। हत्या की प्रक्रिया एक अच्छा विचार नहीं है। यदि उस प्रक्रिया में कोई शटडाउन या स्टॉप कमांड है तो स्क्रिप्ट को संपादित करें और kill -9कमांड को उस shutdownकमांड से बदलें ।


मैं वहाँ छोटी नींद लगाने पर विचार
करूँगा

@ जॉर्ज एडिसन आपने ऐसा कैसे किया। जब मैंने चिपकाने की कोशिश की, तो यह मुझे अजीब तरह से स्वरूपित पाठ दे रहा था। डेनवर्को: आप नींद कहाँ डालना चाहेंगे। मैंने पहले ही लूप में १० सेकंड की नींद पूरी कर ली है
आमे जे

2
समाधान के लिए धन्यवाद, जैसा कि नीचे उल्लेख किया गया है, मैं इसकी जांच कर सकता हूं। हालांकि सभी को मारने की प्रक्रियाओं के बारे में सख्त चेतावनी क्यों? क्लस्टर प्रबंधन सॉफ्टवेयर (एलएसएफ, पीबीएस, एट अल) यह सब उस समय करता है जब कोई प्रक्रिया उन संसाधनों की मात्रा से अधिक हो जाती है जो इसके लिए अनुरोध करती हैं, जिनके कोई गंभीर परिणाम नहीं होते हैं। मैं मानता हूं कि यह नए उपयोगकर्ताओं के लिए एक अच्छा समाधान नहीं है, जो इसे गलत तरीके से समझने की संभावना रखते हैं, लेकिन सही परिस्थितियों में, यह काफी उपयोगी हो सकता है।
क्रिसमिलर

@chrisamiller मैंने भविष्य के पाठकों के लिए एक चेतावनी दी है। आपके मामले में, आप निहितार्थ जानते हैं, लेकिन इस पोस्ट के भविष्य के पाठक को इस तरह के निहितार्थों के बारे में पता नहीं हो सकता है।
अमेय जह

2
क्या आप ऐसा करने के लिए विस्तृत क्यों नहीं कर सकते हैं?
जटर्म

2

पैकेज prlimitसे उपकरण का प्रयास करें util-linux। यह संसाधन सीमाओं के साथ एक कार्यक्रम चलाता है। यह prlimitसीमा को स्थापित करने के लिए सिस्टम कॉल का उपयोग करता है, जिसे तब कर्नेल द्वारा शुद्ध रूप से लागू किया जाता है।

आप 16 सीमाओं को कॉन्फ़िगर कर सकते हैं, जिनमें शामिल हैं:

  • सेकंड में CPU समय की अधिकतम राशि
  • उपयोगकर्ता प्रक्रियाओं की अधिकतम संख्या
  • अधिकतम निवासी सेट आकार ("प्रयुक्त मेमोरी")
  • अधिकतम आकार एक प्रक्रिया मेमोरी में लॉक हो सकती है
  • वर्चुअल मेमोरी का आकार
  • खुली हुई फ़ाइलों की अधिकतम संख्या
  • फ़ाइल लॉक की अधिकतम संख्या
  • लंबित संकेतों की अधिकतम संख्या
  • POSIX संदेश कतारों में अधिकतम बाइट्स

0

यह एक टिप्पणी फिट करने के लिए बहुत बड़ा था। मैंने एमी की मूल स्क्रिप्ट को संशोधित करने के लिए एक को शामिल किया है pgrep, इसलिए मैन्युअल रूप से प्रक्रिया आईडी दर्ज करने के बजाय, आप केवल नाम से बाहर कर सकते हैं। उदाहरण के लिए, ./killIf.sh chrome 4000किसी भी क्रोम प्रक्रिया को मारता है जो स्मृति उपयोग में 4GB से अधिक है।

#!/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

संकीर्ण grep स्ट्रिंग का चयन करने के लिए सावधान रहें और अनजाने प्रक्रियाओं को अनावश्यक रूप से मारने के लिए एक बड़ी पर्याप्त मेमोरी सीमा नहीं है।

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