2010-01-07 21 views
7

विभिन्न पर्ल स्क्रिप्ट्स (सर्वर साइड शामिल) वेबसाइट पर कई फ़ंक्शंस के साथ एक पर्ल मॉड्यूल को कॉल कर रहे हैं। संपादित करें: स्क्रिप्ट का उपयोग कर रहे हैं किसी फ़ोल्डर से पुस्तकालयों का संदर्भ देने के लिए lib का उपयोग करें। व्यस्त अवधि के दौरान स्क्रिप्ट (पुस्तकालय नहीं) ज़ोंबी बन जाते हैं और सर्वर को अधिभारित करते हैं।अपाचे 1.3 के तहत चलने वाले पर्ल सीजीआई स्क्रिप्ट में ज़ोंबी से कैसे बच सकता हूं?

सर्वर सूचियां:

319 ?  Z  0:00 [scriptname1.pl] <defunct>  
320 ?  Z  0:00 [scriptname2.pl] <defunct>  
321 ?  Z  0:00 [scriptname3.pl] <defunct> 

मैं प्रत्येक के उदाहरण के सैकड़ों की है।

संपादित करें: हम उपयोग नहीं कर रहे कांटा, सिस्टम या कार्यकारी के अलावा लघु उद्योग के निर्देश फार्म

<!--#exec cgi="/cgi-bin/scriptname.pl"--> 

जहाँ तक मुझे पता है, इस मामले में खुद को इस प्रक्रिया के मालिक हो जाएगा लिये httpd। MaxRequestPerChild 0 पर सेट है जो बच्चे की प्रक्रिया समाप्त होने से पहले माता-पिता को मरने नहीं देना चाहिए।

अब तक हमने पाया है कि अस्थायी रूप से कुछ स्क्रिप्ट को निलंबित करने से सर्वर को निष्क्रिय प्रक्रियाओं के साथ सामना करने में मदद मिलती है और इसे गिरने से रोकने में मदद मिलती है, हालांकि ज़ोंबी प्रक्रियाएं अभी भी संदेह के बिना बन रही हैं। जाहिर है gbacon अपने सिद्धांत के साथ सत्य के सबसे नज़दीकी प्रतीत होता है कि सर्वर लोड से निपटने में सक्षम नहीं है।

इन प्रक्रियाओं को छोड़कर httpd क्या हो सकता है? क्या इन्हें होने से रोकने के लिए कोई सर्वोत्तम अभ्यास है?

धन्यवाद

उत्तर: बिंदु रोब को जाता है। जैसा कि वह कहता है, सीजीआई स्क्रिप्ट जो एसएसआई उत्पन्न करती हैं, उनमें एसएसआई का संचालन नहीं होगा। अपाचे 1.3 अनुरोध चक्र में सीजीआई के चलने से पहले एसएसआई का मूल्यांकन होता है। यह अपाचे 2.0 और बाद में तय किया गया था ताकि सीजीआई एसएसआई कमांड उत्पन्न कर सके।

चूंकि हम अपाचे 1.3 पर चल रहे थे, प्रत्येक पृष्ठ के लिए एसएसआई निष्क्रिय प्रक्रियाओं में बदल गया था। हालांकि सर्वर उन्हें साफ़ करने की कोशिश कर रहा था, लेकिन यह सफल होने में सक्षम होने के लिए चल रहे कार्यों के साथ बहुत व्यस्त था। नतीजतन, सर्वर गिर गया और उत्तरदायी बन गया। एक अल्पकालिक समाधान के रूप में हमने सभी एसएसआई की समीक्षा की और सर्वर संसाधनों को मुक्त करने और इसे साफ करने के लिए समय देने के लिए कुछ प्रक्रियाओं को क्लाइंट साइड में स्थानांतरित कर दिया। बाद में हमने अपाचे 2.2 में अपग्रेड किया।

+9

आपको एक पाइप बम फेंकने की आवश्यकता है –

+5

डबल बैरल शॉट-गन अच्छी तरह से काम करता है। – Nate

+0

उन्हें अपने मस्तिष्क को भी खाने न दें। – Hai

उत्तर

2

मैंने अभी आपकी टिप्पणी देखी है कि आप अपाचे 1.3 चला रहे हैं और यह आपकी समस्या से जुड़ा हो सकता है।

एसएसआई सीजीआई चला सकता है। लेकिन सीजीआई स्क्रिप्ट जो एसएसआई उत्पन्न करती हैं, उनमें एसएसआई का संचालन नहीं होगा। अपाचे 1.3 अनुरोध चक्र में सीजीआई के चलने से पहले एसएसआई का मूल्यांकन होता है। यह अपाचे 2.0 और बाद में तय किया गया था ताकि सीजीआई एसएसआई कमांड उत्पन्न कर सके।

जैसा कि मैंने उपरोक्त सुझाव दिया था, अपनी स्क्रिप्ट को अपने आप चलाने की कोशिश करें और आउटपुट पर नज़र डालें। क्या वे एसएसआई पैदा कर रहे हैं?

संपादित करें: क्या आपने एक हैलो वर्ल्ड टाइप HTTP प्रतिक्रिया मुद्रित करने के लिए एक छोटी सी पर्ल सीजीआई स्क्रिप्ट लॉन्च करने का प्रयास किया है?

फिर इस काम करता है इस तरह के

<!--#printenv --> 

के रूप में एक छोटी सी लघु उद्योग निर्देशों जोड़ सकते हैं और देखो क्या होता है अगर।

संपादित करें 2: बस एहसास हुआ कि शायद क्या हो रहा है। लाश तब होते हैं जब एक बच्चे की प्रक्रिया निकलती है और इसकाटा नहीं जाता है। ये प्रक्रियाएं प्रक्रिया तालिका के भीतर संसाधनों का उपयोग करके और धीरे-धीरे लटक रही हैं। माता-पिता के बिना एक प्रक्रिया अनाथ प्रक्रिया है।

क्या आप अपनी पर्ल स्क्रिप्ट के भीतर प्रक्रियाओं को बंद कर रहे हैं? यदि हां, तो क्या आपने अभिभावक को एक प्रतीक्षापिड() कॉल जोड़ा है?

क्या आपको स्क्रिप्ट के भीतर भी सही बाहर निकलना है?

CORE::exit(0); 
+0

मैंने डीबगर के माध्यम से सभी स्क्रिप्ट चलाई और सभी त्रुटियों और चेतावनियों को खत्म कर दिया। वे आउटपुट ठीक से उत्पन्न कर रहे हैं। हम वैसे भी 2.0 तक अपग्रेड करने वाले थे। क्या आपको लगता है कि मदद मिलेगी? –

+0

ठीक है। सभी त्रुटियों और चेतावनियों को खत्म करने के लिए डीबगर के साथ अच्छा काम। क्या आपके पर्ल सीजीआई में से कोई भी सफलतापूर्वक पूरा होने के लिए चल रहा है? –

+0

जैसा कि मैंने कहा था कि वे ठीक चल रहे हैं। इस तथ्य के अलावा कि वे लाश बन जाते हैं वे पूरी तरह से चल रहे हैं। –

7

अधिक सबसे अच्छा अभ्यास से बैंड-एड, लेकिन कभी कभी आप सरल

$SIG{CHLD} = "IGNORE"; 

के साथ भाग perlipc documentation

सबसे यूनिक्स प्लेटफार्मों पर के अनुसार प्राप्त कर सकते हैं, CHLD (कभी कभी भी CLD के रूप में जाना) संकेत 'IGNORE' के मूल्य के संबंध में विशेष व्यवहार है। ऐसे प्लेटफॉर्म पर $SIG{CHLD} से 'IGNORE' को सेट करने पर ज़ोंबी प्रक्रियाओं का निर्माण नहीं होता है जब माता-पिता की प्रक्रिया wait() पर अपने बच्चे की प्रक्रियाओं पर विफल होती है (यानी।, बाल प्रक्रियाओं का स्वचालित रूप से उपयोग किया जाता है)। wait() पर $SIG{CHLD} को 'IGNORE' पर सेट करना आमतौर पर ऐसे प्लेटफ़ॉर्म पर -1 देता है।

आप बच्चे प्रक्रियाओं के निकास स्थितियों के बारे में परवाह है तो आप उन्हें लेने की जरूरत wait या waitpid फोन करके (आमतौर पर "उठा" के रूप में)। डरावनी नाम के बावजूद, एक ज़ोंबी केवल एक बाल प्रक्रिया है जो बाहर निकल गई है, लेकिन जिसकी स्थिति अभी तक नहीं ली गई है।

अपने पर्ल कार्यक्रमों खुद को बच्चा प्रक्रियाओं लाश बनने रखते हैं, उनके माता-पिता (जो कि forking और भूल कर रहे हैं अपने कोड) खुद को बाद साफ करने के लिए की जरूरत का मतलब है कि। एक प्रक्रिया खुद को ज़ोंबी बनने से नहीं रोक सकती है।

+0

बहुत बहुत धन्यवाद जी मैं नहीं कह रहा हूं कि मैं समझता हूं कि यह कैसे काम करता है लेकिन मैं इसके बारे में और अधिक पढ़ूंगा। मुझे लगता है कि सीएचएलडी कॉलिंग स्क्रिप्ट में जाता है। क्या वह सही है? –

+5

प्रतीक्षापिड (-1, WNOHANG) ब्लॉक नहीं होगा, इसलिए इसे समय-समय पर बाल निकास की स्थिति एकत्र करने के लिए कहा जा सकता है। अपने सभी लाशों को काटने के लिए इस तरह एक लूप का उपयोग करें: जबकि (($ pid = waitpid (-1, WNOHANG))> 0) ... –

+0

@G Berdal आपकी स्क्रिप्ट कैसे शुरू की जा रही हैं? क्या आप उस कोड को नियंत्रित करते हैं? –

0

जैसा कि आपके पास सभी बिट्स हैं, मैं सलाह देता हूं कि कमांड लाइन से एक समय में अलग-अलग स्क्रिप्ट को चलाने के लिए यह देखने के लिए कि क्या आप लटक रहे हैं या नहीं।

क्या एक पीएस लिस्टिंग एक विशेष स्क्रिप्ट चलाने के उदाहरणों की एक अनोखी संख्या दिखाती है?

क्या आप CG_ का उपयोग mod_perl का उपयोग कर रहे हैं?

संपादित करें: बस एसएसआई के संबंध में आपकी टिप्पणियां देखीं। यह मत भूलना कि एसएसआई निर्देश खुद पर्ल स्क्रिप्ट चला सकते हैं। सीजीआई चलाने की कोशिश कर रहे हैं यह देखने के लिए एक नज़र डालें?

क्या वे अभी तक किसी अन्य सर्वर या सेवा पर निर्भर हैं?

+0

मैंने लटक रहे लोगों को देखा है। वेबपृष्ठ पर लगभग सभी एसएसआई एकाधिक ज़ोंबी उदाहरण बन जाते हैं। वे कार्यों के लिए पुस्तकालय बुला रहे हैं। मुझे इस बारे में निश्चित नहीं है कि इनके लिए माता-पिता के रूप में कौन गिना जाता है? –

+0

एसएसआई या सीजीआई नामक प्रक्रिया उसके माता-पिता हैं। आप पीपीआईडी ​​(पैरेंट प्रोसेस आईडी) को देखने के लिए 'ps' का उपयोग करने का प्रयास कर सकते हैं और फिर यह प्रक्रिया देख सकते हैं, लेकिन मैं सकारात्मक नहीं हूं कि 'ps' ज़ोंबी के लिए एक पीपीआईडी ​​वापस करेगा या नहीं। (ऐसा लगता है कि इसे करना चाहिए, क्योंकि ज़ोंबी को यह जानना है कि इसे किसने पकड़ा है, मैंने अभी सत्यापित नहीं किया है कि यह काम करता है।) मेरे लिए, 'ps -l' के आउटपुट में पीपीआईडी ​​शामिल है; यदि आपका 'ps' अलग-अलग व्यवहार करता है तो अपने स्थानीय व्यक्ति पृष्ठ की जांच करें। –

+0

@ डेव, जब एक प्रक्रिया एक ज़ोंबी है तो इसकी परिभाषा के अनुसार कोई पीपीआईडी ​​नहीं है। –

संबंधित मुद्दे

 संबंधित मुद्दे