2011-10-20 11 views
17

मेरे पास एक जावा ऐप है जो बाहरी प्रक्रिया बनाता है और एक इनपुटस्ट्रीम के माध्यम से 'stdout प्रक्रिया को पढ़ता है। जब मैं इसके साथ काम करता हूं तो मुझे प्रक्रिया को मारने में सक्षम होना चाहिए। क्या इस प्रक्रिया में एक सिगिनट सिग्नल भेजने का कोई तरीका है? (जैसे कि मैंने कंसोल से Ctrl + C दबाया)।जावा से बाहरी प्रक्रिया में SIGINT सिग्नल कैसे भेजें?

बाहरी प्रक्रिया मेरा कोड नहीं है और मैं इसे संशोधित नहीं कर सकता।

उत्तर

2

क्या आप बाहरी प्रोग्राम को java.lang.Process के रूप में चला रहे हैं? चूंकि प्रक्रिया वर्ग में destroy() विधि है।

+8

ऐसा लगता है कि एक सिगरेट सिग्नल भेजना है, सिगिनट नहीं। इस सवाल को यहां देखें: http://stackoverflow.com/questions/2950338/how-can-i-kill-a-linux-process-in-java-with-sigkill-process-destroy-does-sigte –

13

आप इस प्रक्रिया (यह देखते हुए कि आप इस प्रक्रिया आईडी पता) करने के लिए kill -SIGINT <pid> भेज सकते हैं:

Runtime.getRuntime().exec("kill -SIGINT 12345"); 
बेशक

, कि एक मंच पर निर्भर समाधान के लिए होगा ... संभावित है, तो आप में सक्षम हो जाएगा इस उपकरण का उपयोग करने के लिए, हालांकि यह "सैंडबॉक्स मोड" में है। लेकिन यह आप यह अनुमान लगा सकता है:

http://commons.apache.org/sandbox/runtime/

यहाँ भी देखें इस संबंधित सवाल:

how can I kill a Linux process in java with SIGKILL Process.destroy() does SIGTERM

+2

कोई प्लेटफ़ॉर्म-स्वतंत्र समाधान नहीं है [विंडोज़ के पास सिग्नल नहीं हैं] (http://stackoverflow.com/questions/140111/sending-an-arbitrary- सिग्नल-in- विन्डोज़)। –

+0

@fix_moeller: मुझे लगता है कि आप सही हैं। लेकिन हो सकता है कि कम से कम अन्य प्रक्रियाओं को मारने के लिए कुछ प्रकार के अमूर्तता प्रदान करने वाली लाइब्रेरी है ... –

+0

@ लुकास एडर, मेरे पास एक सवाल है, अगर मैं इस प्रक्रिया को एक नए धागे में खोलता हूं, और फिर कहता हूं कि इसे फांसी दी गई है, और मैं लिनक्स (किसी अन्य थ्रेड से) में सिगिनट का उपयोग करके इसे मारता हूं, यह मूल रूप से मेरे पूरे जावा प्रोग्राम को मारता है, क्या कोई संभावना है कि मेरा प्रोग्राम अभी भी चल रहा है, जबकि केवल यह विशेष प्रक्रिया मारे जा रही है ???? –

2

दुर्भाग्य से एक देशी तरीका जावा में एक arbirtray संकेत भेजने के लिए नहीं है।

मैं Runtime.exec() का उपयोग करने में लुका से सहमत हूं या आप Posix for Java लाइब्रेरी जैसे कुछ उपयोग कर सकते हैं।

3

यदि आप वर्तमान प्रक्रिया (उर्फ जेवीएम) को सिग्नल भेजना चाहते हैं तो Google से यहां आने वाले अन्य लोगों के लिए आप sun.misc.Signal.raise() विधि का उपयोग कर सकते हैं। व्यक्तिगत रूप से मुझे इसकी आवश्यकता है जो जेएनआई लाइब्रेरी का उपयोग कर रहा हूं।

+0

ऐसा लगता है कि एक वास्तविक सिग्नल नहीं भेजता है, केवल सिग्नल हैंडलर को कॉल करें। या – dkagedal

+0

@ जेसन एक्सेलसन मैं भी sun.misc.Signal.raise (नया सिग्नल ("टीईआरएम") का उपयोग कर रहा हूं; मैं जेएनआई घटक शुरू कर रहा हूं जो चल रहा है और कभी नहीं रोकता है, पूर्व संध्या n मेरे अन्य धागे बंद कर रहे हैं। इसलिए मैं अपने आवेदन को बंद करने के लिए इस समाधान का उपयोग कर रहा हूं। – vijayashankard

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