2016-02-05 11 views
9

में किसी प्रक्रिया को मारने का सही तरीका जावा में प्रक्रिया को मारने का सबसे अच्छा तरीका क्या है?जावा

पीआईडी ​​प्राप्त करें और फिर Runtime.exec() के साथ इसे मार डालें?

destroyForcibly() का उपयोग करें?

इन दो तरीकों के बीच क्या अंतर है, और क्या कोई अन्य समाधान है?

+1

अपनी खुद की प्रक्रिया या किसी अन्य प्रक्रिया इस है के साथ शुरू किया गया था पर जा रहे हैं? –

+0

क्या यह जावा प्रक्रिया है या कोई प्रक्रिया है? – Derlin

+0

यह बाहरी गैर-जावा प्रक्रिया के लिए था, लेकिन दोनों तरह के लिए धन्यवाद Shitsu – Kariamoss

उत्तर

9

प्रक्रिया तुम्हें मारना चाहते हैं कि आपके आवेदन

द्वारा शुरू किया गया है, तो फिर आप शायद यह (ProcessBuilder.start() या Runtime.exec() दोनों एक संदर्भ वापसी) के लिए एक संदर्भ है। इस मामले में, आप बस p.destroy() पर कॉल कर सकते हैं। मुझे लगता है कि यह सबसे साफ तरीका है (लेकिन सावधान रहें: p द्वारा शुरू की गई उप-प्रक्रियाएं जीवित रह सकती हैं, अधिक जानकारी के लिए http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092 देखें)।

destroyForcibly का उपयोग केवल तभी किया जाना चाहिए जब destroy() एक निश्चित टाइमआउट के बाद विफल हो। संक्षेप

  1. में साथ destroy()
  2. उचित समय समाप्ति के साथ शान से बाहर निकलने के लिए प्रक्रिया की अनुमति देने के प्रक्रिया समाप्त
  3. destroyForcibly() के साथ मारने यदि प्रक्रिया अभी भी जीवित

प्रक्रिया तो है आप मारना चाहते हैं बाहरी

फिर आपके पास अधिक विकल्प नहीं है: आपको ओएस एपीआई (Runtime.exec) से गुजरना होगा। विंडोज़ पर, कॉल करने के लिए प्रोग्राम taskkill.exe होगा, जबकि मैक और लिनक्स पर आप kill को आजमा सकते हैं।


अधिक जानकारी के लिए https://github.com/zeroturnaround/zt-exec/issues/19 और Killing a process using Java और http://invisiblecomputer.wonderhowto.com/how-to/code-simple-java-app-kill-any-process-after-specified-time-0133513/ पर एक नज़र डालें।

+0

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद! यह निश्चित रूप से मैं क्या देख रहा था – Kariamoss

4

यदि आप मुख्य प्रक्रिया को मारने की कोशिश कर रहे हैं तो आपका जावा कोड शुरू हुआ, मैं System.exit() का उपयोग करने का सुझाव दूंगा। लाभ यहां समझाए गए हैं: when should we call system exit in java

अनिवार्य रूप से, System.exit() शटडाउन हुक चलाएगा जो सुनिश्चित करेगा कि कोई भी निर्भर गैर-डिमन प्रक्रियाएं जो आपके काम को पूरा नहीं कर पाती हैं, आपकी प्रक्रिया से पहले मारे गए हैं। यह करने का यह साफ तरीका है।

तो प्रक्रिया आपकी नहीं है, आप के रूप में इस जवाब में बताया गया है ऑपरेटिंग सिस्टम पर भरोसा करने के लिए आप यह काम करना होगा: Killing a Process Using Java

* nix पर एक मार Runtime.exec() के अपने सुझाव उस मामले में होगा जाने का एक सभ्य तरीका बनें।

अब destroyForcibly() के लिए के रूप में, आप आमतौर पर कॉल करने के लिए कि एक बच्चे की प्रक्रिया अपने जावा कोड द्वारा पैदा की है कि शायद प्रक्रिया एपीआई ProcessBuilder.start() या Runtime.exec()