2015-04-16 5 views
22

मैं org.jruby.embed.ScriptingContainer एपीआई का उपयोग कर एक जेवीएम प्रक्रिया के अंदर जेआरबीई पर एक मिडलमैन (जो वीब्रिक का उपयोग करता है) सर्वर चला रहा हूं।JVM प्रक्रिया में SIGTERM के जवाब में मैं एक एम्बेडेड JRuby को कैसे बंद कर सकता हूं?

अगर मैं साफ़ रूप से बंद कर देता हूं और सर्वर को JVM के अंदर से रोकता हूं, तो सब कुछ अपेक्षित काम करता है।

लेकिन अगर मैं JVM प्रक्रिया में एक सिगरेट भेजता हूं (उदाहरण के लिए, कमांड लाइन पर ctrl + c को मारकर), कंसोल लौटाता है लेकिन JVM प्रक्रिया समाप्त नहीं होती है - यह अनिश्चित काल तक लटकती है जब तक कि मैं इसे सिगकिल नहीं भेजता ।

मैंने ScriptingContainer उदाहरण को समाप्त करने के लिए एक जेवीएम शटडाउन हुक पंजीकरण करने का प्रयास किया, लेकिन हुक कभी नहीं आग लगती है। मुझे यकीन नहीं है कि क्यों ... शायद JRuby किसी भी तरह से SIGTERM निगल रहा है?

मैं JVM को सभी तरह से बंद करने के लिए कैसे प्राप्त कर सकता हूं, साफ-सुथरा, भले ही इसमें चल रहे वेब्रिक सर्वर हों?

+0

क्या आपने सत्यापित किया है कि समस्या 'स्क्रिप्टिंग कोंटेनर' को स्वैप करके, ''org.jruby.embed.EmbedRubyInstanceConfigAdapter'] (http://javadox.com/org.jruby/jruby] के कुछ भी कार्यान्वयन के लिए संभवतः JRuby है। -कंपूर्ण/1.7.13/संगठन/jruby/एम्बेड/embedRubyInstanceConfigAdapter.html) और देख रहा है कि समस्या बनी रहती है? – durron597

+10

नियंत्रण-सी SIGTERM नहीं भेजता है, यह SIGINT – rghome

+2

भेजता है आप किस ओएस पर हैं? क्या आप ctrl + c दबाए जाने के बाद JVM का थ्रेड डंप प्रदान कर सकते हैं? ('jstack ' चलाएं) आप कैसे जांचते हैं कि आपका शटडाउन हुक आग लग रहा है या नहीं? –

उत्तर

1

लगता है जैसे kill -9 शटडाउन हुक ट्रिगर नहीं करता है, लेकिन kill -15 करता है।

This StackOverflow question एक ही समस्या का विस्तृत उत्तर है।

नीचे की रेखा है, आप खराब हो गए हैं, क्योंकि kill -9 सिग्नल को रोकने और JVM रोक से पहले कुछ रखरखाव कार्यों को करने के लिए कोई भी तरीका मौजूद नहीं लगता है।

+0

सिग्नल मैन पेज "" सिग्नल सिग्कील और सिगस्टॉप को सिग्नल, अवरुद्ध या अनदेखा नहीं किया जा सकता है। "", आप वास्तव में सी प्रोग्राम में सिगकिल को भी संभाल नहीं सकते हैं। Http: // man7।संगठन/लिनक्स/मैन-पेज/मैन 7/सिग्नल 7.html – workless

+0

मुझे सिगकिल को संभालने की आवश्यकता नहीं है ... यह ठीक है क्योंकि यह अभी भी एक पूर्ण प्रक्रिया शटडाउन में परिणाम देता है। मेरी समस्या एक SIGTERM या SIGINT पर पता लगाना और समाप्त करना है। लिनक्स पर – levand

+0

सिगिनट और सिगरेट सिग्नल मनाए गए थे लेकिन विंडोज़ में इन अनुप्रयोगों को एप्लिकेशन में कभी नहीं भेजा गया था। – Kiran

0

सबसे पहले, एक डिबगिंग चाल: आप एक जावा प्रक्रिया में SIGQUIT भेज सकते हैं ताकि यह सभी चल रहे धागे के मौजूदा स्टैक निशान मुद्रित कर सके। यह आपको निदान करने में मदद कर सकता है कि कौन से धागे JVM को बाहर निकलने का कारण नहीं बना रहे हैं।

SIGINT, SIGHUP भेजना, या SIGTERM जावा को इसके शटडाउन हुक चलाने के लिए कारण बनता है, फिर बाहर निकलें। आप इसे java.lang.Terminator में देख सकते हैं। सिग्नल प्राप्त होने के बाद, प्रक्रिया को समाप्त करने से पहले java.lang.Shutdown सभी शट डाउन हुक चलाते हैं। Shutdown.halt() को तब तक नहीं बुलाया जाता है जब तक शटडाउन हुक समाप्त नहीं हो जाते हैं, जो बताता है कि आपके पास एक शटडाउन हुक है जो लटक रहा है।

वास्तविक कोड या स्टैक निशान के बिना उस से अधिक सटीक उत्तर प्रदान करना मुश्किल है, लेकिन SIGINT भेजने के बाद जीवित रहने वाला एक JVM आमतौर पर शटडाउन हुक में कुछ अजीब कर रहा है। यदि SIGINT भेजने की कोशिश करने के लिए पर्याप्त नहीं है, तो कुछ सेकंड प्रतीक्षा करें, फिर SIGQUIT भेजना, और परिणामस्वरूप परिणामस्वरूप स्टैक निशान जोड़ना।

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

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