क्या मैं एक निश्चित समय / सीपीयू चक्र के लिए एक प्रक्रिया को सीमित कर सकता हूं?


16

हमारे पास एक स्क्रिप्ट है जो हमारे वेब सर्वर पर चलती है, जो ग्राहक कार्रवाई से ट्रिगर होती है, जो कुछ कैश फ़ाइलों को उत्पन्न करने के लिए एक यूनिक्स प्रक्रिया शुरू करती है। क्योंकि यह प्रक्रिया हमारे ग्राहक द्वारा आपूर्ति की गई फ़ाइलों पर कार्य करती है, यह कभी-कभी गलत व्यवहार करती है, इतना लंबा चल रहा है कि PHP प्रक्रिया जो इसे बाहर निकालती है या सीपीयू समय का उपयोग करके इतना है कि एक sysadmin इसे मार देगा।

क्या कोई कमांड है जो मैं चला सकता हूं जो सीपीयू समय / प्रक्रिया के रनटाइम को सीमित करेगा? मैं एक कमांड की तरह देख रहा हूं /usr/bin/time, जहां मैं उस कमांड को चला सकता हूं और इसे कमांडलाइन पास कर सकता हूं जो मैं चाहता हूं कि इसे चलाएं और सीमित करें।

जवाबों:


13

गिलेस उत्तर के अलावा cpulimit टूल है जो वास्तव में वही करता है जो आप चाहते हैं - रनटाइम में मॉडिफ़ाइंग सहित। इसके अतिरिक्त यह केवल कुछ सीपीयू / कोर IIRC तक सीमित हो सकता है।


12

एक कार्यक्रम के भीतर से, कॉल करें setrlimit(RLIMIT_CPU, ...)। शेल से, कॉल ulimit -t 42(यह मानक नहीं है लेकिन अधिकांश यूनिक्स वेरिएंट पर अधिकांश शेल (बैश और ksh सहित) द्वारा समर्थित है)। यह वर्तमान प्रक्रिया को CPU समय के N सेकंड का उपयोग करने के बाद मार दिया जाता है। सीमा बाल प्रक्रियाओं द्वारा विरासत में मिली है। एक सामान्य शेल मुहावरा है (ulimit -t 42; runaway_process)यदि आप उसी शेल से बाद में अन्य असीमित प्रक्रियाओं को चलाने में सक्षम होना चाहते हैं।

यह भी देखें कि क्या यूनिक्स में किसी विशेष प्रक्रिया का उपयोग करने वाली मेमोरी की मात्रा को सीमित करने का एक तरीका है? । सिद्धांत समान है, आप सिर्फ एक अलग संसाधन सीमित कर रहे हैं।


समस्या यह है, मेरे पास कार्यक्रम के लिए स्रोत कोड नहीं है इसलिए मैं नहीं जोड़ सकता setrlimitऔर मैं इसे PHP के माध्यम से बता रहा हूं इसलिए मेरे पास कोई शेल नहीं है ...
जोश

6
@ जोश: यदि आप एक निर्माण के लिए अनुरूप देख रहे हैं time php /cgi/foo.php, तो आप उपयोग कर सकते हैं bash -c 'ulimit -t 42; exec "$0" "$@"' php /cgi/foo.php
गिल्स एसओ- बुराई को रोकना '

@ जोश अपाचे? मुझे भी लगता है कि इस सामान को सिस्टम चौड़ा किया जा सकता है ...
xenoterracide

@xenoterracide हाँ यह अपाचे है, लेकिन मैं केवल इस एक प्रक्रिया को सीमित करना चाहता हूं, सभी अपाचे प्रक्रियाओं को नहीं। गिल्स के बैश ऑनलाइनर शानदार काम कर सकते हैं!
जोश

3

आप timeoutकिसी निश्चित समय से अधिक समय तक चलने से एक प्रक्रिया को रोकने के लिए कमांड का उपयोग कर सकते हैं ।

उदाहरण

$ date
Mon May  6 07:35:07 EDT 2013
$ timeout 5 sleep 100
$ date
Mon May  6 07:35:14 EDT 2013

देखें टाइमआउट आदमी पेज अधिक जानकारी के लिए।

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