2009-04-29 10 views
9

में बाल प्रक्रियाओं को नहीं मार रहा है मेरे पास एक जावा ऐप है जो ऑपरेटिंग सिस्टम कमांड तैयार करने के लिए ProcessBuilder का उपयोग करता है और मुझे Process ऑब्जेक्ट देता है। (वास्तविक os कमांड sgwin का उपयोग कर ssh पर rsync है)।जावा प्रोसेसबिल्डर प्रक्रिया.destroy() WinXP

यह विंडोज में अच्छी तरह से काम कर रहा है, फिर भी अगर मैं process.destroy() का उपयोग कर इसे ..... बच्चे ssh और rsync प्रक्रियाओं को बंद नहीं होगा मेरे पास प्रक्रिया को रोकने के लिए मैन्युअल रूप से Windows कार्य प्रबंधक का उपयोग कर उन्हें मारने के लिए चाहता हूँ ..

क्या प्रक्रिया के OutputStream प्राप्त करना संभव है और destroy(); पर कॉल करने से पहले किसी भी तरह से ctrl-c भेजना संभव है?

यदि किसी के पास किसी कामकाज पर कोई विचार है तो यह बहुत अच्छा होगा। धन्यवाद, डी

+1

Ctrl-C एक टर्मिनल फ़ंक्शन है जो प्रक्रिया आईडी में सिग्नल (SIGTERM?) भेजता है। इसलिए अनुकरण करने के लिए कि आपको प्रक्रिया आईडी की आवश्यकता होगी और एक सिग्नल भेजने में सक्षम होने के लिए –

उत्तर

5

मुझे यह भी लगता है कि एसएसएच को मारने के लिए Ctrl-C अनुकरण करना समस्याग्रस्त है।

मैं क्या करूँगा, निम्नलिखित दृष्टिकोणों में से एक है। या तो एसएसएच के बेटे कौन हैं (जो थोड़ा सा समस्याग्रस्त है, यह जानने के लिए विंडोज कमांड का उपयोग करें, क्योंकि आपको अपने बच्चों की प्रक्रियाओं को प्राप्त करने के लिए अपने वर्तमान पिड को जानने की आवश्यकता है)। मेरा मानना ​​है कि pstools sysinternals का एक अच्छा कमांड लाइन उपकरण है जो आपको अनाथ प्रक्रियाओं को ट्रैक करने में सक्षम होना चाहिए। taskList.exe (जो आपको सीएसवी प्रारूप बीटीडब्लू में अपना आउटपुट दे सकता है) या एक विशेष वीबीस्क्रिप्ट निष्पादित करके विंडोज प्रक्रियाओं को नियंत्रित करने के लिए this example देखें।

दूसरा दृष्टिकोण एसएसएच प्रक्रिया निष्पादित करने और नियंत्रित करने के लिए winp जैसे जावा लाइब्रेरी का उपयोग कर रहा है। मेरा मानना ​​है कि आप अपने सभी बच्चों को सूचीबद्ध करने में सक्षम होंगे और सही संदेश भेजने पर जबरन उन्हें मार डालेंगे। यह मेरा पसंदीदा दृष्टिकोण होगा। कृपया ध्यान दें कि killRecursively विधि वही है जो आप चाहते हैं।

कृपया ध्यान दें कि उन दृष्टिकोणों को केवल आपके एप्लिकेशन विंडो प्रस्तुत नहीं करना चाहिए। आप उन वर्गों को समाहित कर सकते हैं जो विंडोज और लिनक्स मशीनों पर अलग-अलग चलेंगे।

कृपया ध्यान दें कि मैंने विंडोज़ प्रक्रियाओं पर जुर्माना नियंत्रण प्राप्त करने की कोशिश नहीं की है, इसलिए मुझे यकीन नहीं है कि उन समाधानों को मैं कितना परिपक्व करूंगा।

+0

Winp लोकप्रियता में उगाया गया प्रतीत होता है, और हडसन का हिस्सा है (वास्तव में, इसके लिए लिखा गया था)। Java.net यूआरएल अब और हल नहीं करता है, लेकिन मूल लेख अभी भी https://weblogs.java.net/blog/kohsuke/archive/2008/03/introducing_win.html पर मौजूद है (ध्यान दें कि उस जानकारी में से कुछ है दिनांकित, केवल 32 बिट की तरह)। Winp के लिए नया यूआरएल (एमवीएन और गिथब के लिंक के साथ) है: http://winp.kohsuke.org/ – toddkaufmann

+0

@toddkaufmann धन्यवाद, यूआरएल अपडेट किया गया। –

0

मुझे यकीन नहीं है कि Process.destroy() कवर के तहत क्या करता है (सिग्नल या समान भेजता है?)।

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

नोट करें कि आप सिगरेटर के साथ /bin/kill और सिगकिल कर सकते हैं यदि यह विशेष रूप से जिद्दी है।

+2

Process.destroy() विंडोज फ़ंक्शन टर्मिनेट प्रोसेस (http://msdn.microsoft.com/en-us/library/ms686714(VS .85) .aspx)। –

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