2009-06-22 17 views
19

पर ग्रेस से शट डाउन करने का सर्वोत्तम तरीका जावा कमांड लाइन प्रोग्राम को बंद करने के लिए मुझे विभिन्न दृष्टिकोणों में दिलचस्पी है। एक हत्या संकेत भेजना एक विकल्प नहीं है।जावा कमांड लाइन प्रोग्राम

मैं कुछ अलग दृष्टिकोणों के बारे में सोच सकता हूं।

  1. एक पोर्ट खोलें और कनेक्शन की प्रतीक्षा करें। जब कोई बनाया जाता है, तो चुपचाप बंद कर दें।
  2. फ़ाइल बनाने के लिए देखें, फिर बंद करें।
  3. टर्मिनल से कुछ इनपुट पढ़ें, जैसे कि "निष्पादन बंद करें"।

तीसरा व्यक्ति आदर्श नहीं है, क्योंकि अक्सर प्रोग्राम आउटपुट स्क्रीन पर पंप हो जाता है। पहला व्यक्ति बहुत अधिक प्रयास करता है (मैं आलसी हूं)। क्या अधिकांश प्रोग्रामर दूसरे विकल्प का उपयोग करते हैं? यदि नहीं, तो और क्या संभव/सुरुचिपूर्ण/सरल है?

+0

क्या आप अपने जावा कमांड लाइन प्रोग्राम को मारने की प्रक्रिया के लिए हैं? – Tom

+2

हत्या संकेत भेजना क्यों एक विकल्प नहीं है? जैसा कि नीचे दिए गए उत्तरों में बताया गया है, आप शटडाउन हुक के साथ मारने वाले सिग्नल को पकड़कर संभाल सकते हैं। – toluju

उत्तर

2

पहला दो विकल्प लागू करने के लिए आसान है। आप कुछ जेएमएक्स सामान भी इस्तेमाल कर सकते हैं (मुझे इसके बारे में ज्यादा जानकारी नहीं है)। टॉमकैट पहले दृष्टिकोण का उपयोग करता है और मैंने अपनी दो परियोजनाओं में 1 और 2 लागू किया।

9

आप Runtime.getRuntime().addShutdownHook() का उपयोग करने की कोशिश कर सकते हैं जो आपकी आवश्यकता को पूरा करना चाहिए। इस तरह से आप एक सुन्दर शट डाउन को दूर करने के लिए क्लीनअप करने के लिए एक हुक पंजीकृत कर सकते हैं।

संपादित

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread) सार्वजनिक शून्य addShutdownHook (धागा हुक) एक नया आभासी मशीन बंद हुक पंजीकृत करता है।

  • कार्यक्रम सामान्य रूप से बाहर निकालता है, जब अंतिम गैर-डेमॉन धागा बाहर निकलता है या जब बाहर निकलें (समतुल्य रूप, System.exit) विधि शुरू हो जाती है, या: जावा आभासी मशीन की घटनाओं के दो प्रकार के जवाब में बंद हो जाता है
  • वर्चुअल मशीन को उपयोगकर्ता इंटरप्ट के जवाब में समाप्त कर दिया गया है, जैसे टाइपिंग^सी, या एक सिस्टम-वाइड इवेंट, जैसे उपयोगकर्ता लॉगऑफ या सिस्टम शट डाउन।
+0

यह काम नहीं करता है जब cntrl + c निष्पादित होता है। –

+0

लेकिन माइक, इसका शानदार तरीके से गिरावट का तरीका है, अगर कोई ctrl + c दबाया जाता है, तो किसी भी cmd प्रोग्राम को मार सिग्नल के साथ समाप्त कर दिया जाएगा। –

+0

आपके द्वारा उल्लिखित अन्य विकल्पों में से कोई भी यद्यपि नहीं होगा, इसलिए ctrl + c पर व्यवहार संभवतः इन विधियों में से किसी एक पर निर्णय लेने के लिए प्रासंगिक नहीं है। – Herms

16

आप कुछ इस तरह की कोशिश कर सकते हैं:

Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { /* 
     my shutdown code here 
    */ } 
}); 

संपादित करें:

बंद हुक बंद प्रदर्शन नहीं करेगा अनुप्रयोग के नीचे। इसके बजाए, यह डेवलपर को किसी भी क्लीन-अप को करने का एक तरीका देता है जिसे वह शट डाउन करना चाहता है।

Runtime के लिए JavaDoc से

(एक अच्छा पढ़ा करता है, तो आप इस विधि का उपयोग करने के लिए योजना बना रहे हैं):

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

+0

यह कैसे अपना प्रोग्राम बंद कर देता है? –

+0

संपादित किया गया। मुझे उम्मीद है कि आपके प्रश्न को संबोधित करेंगे। – akf

+0

क्या रन विधि को @ ओवरराइड एनोटेशन नहीं होना चाहिए? –

5

दूसरे विकल्प का लाभ - फ़ाइल की जांच - पहले - पोर्ट पर सुनना - यह है कि आपके पास सुरक्षा की कुछ संभावना है।

आप निर्देशिका पर अनुमतियां सेट कर सकते हैं जहां फ़ाइल बनाई गई है ताकि केवल उपयुक्त उपयोगकर्ता प्रोग्राम बंद कर सकें। यदि आप किसी पोर्ट पर सुनते हैं तो कोई भी उपयोगकर्ता उससे कनेक्ट हो सकता है।

+0

आप क्लाइंट आईपी पते के आधार पर आने वाली कॉल को सीमित कर सकते हैं। उदाहरण के लिए केवल स्थानीयहोस्ट से कनेक्शन की अनुमति दें। जब आप उचित आईपी पता करते हैं तो आप केवल बाहर निकलते हैं, अन्यथा कनेक्शन बंद करें और एक नया सुनना जारी रखें। – akarnokd

+0

@ kd304 - सीमित आईपी पते अभी भी स्थानीय सिस्टम पर किसी भी उपयोगकर्ता को प्रक्रिया को बंद करने की अनुमति देता है। निर्देशिका पर अनुमतियों को सेट करके आप केवल प्रक्रिया के विशिष्ट उपयोगकर्ता नियंत्रण की अनुमति दे सकते हैं। –

0

मैं शट डाउन हुक का उपयोग करने का सुझाव दूंगा। यह आपके प्रोग्राम को मानक ओएस टूल्स का उपयोग करके नियंत्रित करने की अनुमति देगा। इसे बाहरी संसाधनों (डिस्क, बंदरगाहों, जो कुछ भी) तक अतिरिक्त पहुंच की आवश्यकता नहीं है।

2

यदि आप सॉकेट संस्करण के साथ जाना चाहते हैं, तो इसे लागू करना बहुत आसान है। कोड यह रहा:

ServerSocket server = new ServerSocket(8080); 
System.out.println("Socket listening!"); 
server.accept(); 
System.out.println("Connection received!"); 

आप आसानी से एक अलग थ्रेड है कि आप अपने कार्यक्रम के साथ शुरू, और फिर इसे बंद आरंभ करने के लिए वैश्विक स्थिति संशोधित है में इस कोड को एम्बेड कर सकता है।

1

एक जेएमएक्स घटक होने पर विचार करें। फिर आप स्थानीय रूप से या नेटवर्क पर जेकोनोल के साथ संलग्न कर सकते हैं, और अपने घटक के साथ संवाद कर सकते हैं। फिर घटक प्रोग्राम को ठीक से बंद कर सकता है।

जावा 6 के साथ या बाद में, आप JVisualVM के साथ ऐसा ही कर सकते हैं।

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