2010-11-10 5 views
8

मैं निम्नलिखित कोड का उपयोग कर जावा में एक INT संकेत पकड़ने हूँ का उपयोग कर प्रारंभ:कैसे करें जाल एक जावा आवेदन पत्र में एक संकेत एक bash स्क्रिप्ट

Signal.handle(new Signal("INT"), new SignalHandler() { 
     public void handle(Signal sig) { 

      log.warn("Received SIGINT signal. Will teardown."); 

      task.tearDown(); 

      // Force exit anyway 
      System.exit(1); 
     } 
     }); 

जब मैं java -jar file.jar उपयोग कर रहा हूँ अपने आवेदन शुरू करने के लिए मैं पकड़ कर सकते हैं संकेत kill -INT PID के साथ भेजा गया।

यदि मैं java -jar file.jar & (पृष्ठभूमि में जेवीएम चलाता हूं) को कॉल करता हूं, तो मैं kill -INT के साथ भेजे गए सिग्नल को नहीं पकड़ सकता।

कोई विचार?

धन्यवाद।

+0

जब आप kill -INT का उपयोग करते हैं तो जावा प्रक्रिया क्या करती है? क्या यह समाप्त हो जाता है, या चल रहा है? –

उत्तर

3

मेरे लिए काम करता है। क्या आप वाकई सही पिड को मार रहे हैं? यूनिक्स पर आप लॉन्च की गई अंतिम प्रक्रिया के ढक्कन को प्राप्त करने के लिए $! का उपयोग कर सकते हैं।

$ java -jar file.jar & 
[1] 25573 

$ kill -INT $! 
Received SIGINT signal. Will teardown. 

अद्यतन:

आप एक खोल स्क्रिप्ट के माध्यम से पृष्ठभूमि में इस की शुरूआत कर रहे हैं, ओएस एक नई प्रक्रिया समूह है जो इस तरह के रूप में SIGINT कुंजीपटल-उत्पन्न संकेतों के लिए प्रतिरक्षा हो जाएगा पैदा करेगा। केवल प्रक्रियाएं जिनकी प्रक्रिया समूह आईडी वर्तमान टर्मिनल की प्रक्रिया समूह आईडी से मेल खाती है, इन संकेतों को प्राप्त कर सकती हैं।

तो इस तरह वर्तमान टर्मिनल की प्रक्रिया समूह के भीतर इसे चलाने का प्रयास करें:

. ./script.sh 

फिर आप SIGINT भेजने के लिए सक्षम हो जाएगा।

नौकरी नियंत्रण here के बारे में अधिक जानकारी।

+0

यह मेरे लिए काम करता है। काम नहीं करता है एक बैश स्क्रिप्ट फ़ाइल के अंदर से शुरू किए गए एप्लिकेशन के अंदर सिग्नल को पकड़ रहा है। – simao

+0

@ सिमाओ - जावा प्रोग्राम शुरू करने के लिए आपकी बैश स्क्रिप्ट फ़ाइल कैसे महत्वपूर्ण होगी। क्या आपका जावा प्रोग्राम एक डिमन है? संबंधित दो प्रक्रियाएं कैसे हैं (बैश स्क्रिप्ट और जावा प्रोग्राम)? – justkt

+0

जावा प्रोग्राम एक डेमॉन नहीं है और 2 धागे का उपयोग करके चलता है। जावा ऐप जावा -jar फ़ाइल.जर और एक .sh फ़ाइल के अंदर निष्पादित किया जाता है। धन्यवाद। – simao

0

मुझे लगता है कि बैश स्क्रिप्ट SIGINT को अनदेखा कर रही है और बच्चा सिग्नल मास्क विरासत में है।

इस तरह के कुछ के लिए बैश स्क्रिप्ट में देखें। (केवल 2 से अधिक संख्याएं हो सकती हैं)

trap "" 2 

खाली स्ट्रिंग खोल को SIG_IGN सेट करने का कारण बनती है। यदि आप इसके बजाय उपयोग करते हैं:

trap ":" 2 

वह एक हैंडलर पंजीकृत करता है जो कुछ भी नहीं करता है। जब कोई बच्चा प्रक्रिया शुरू होती है, तो इंस्टॉल किए गए हैंडलर के साथ कोई सिग्नल SIG_DFL पर रीसेट हो जाता है।

+0

मैंने कोशिश की, लेकिन मेरी समस्या का समाधान नहीं किया – simao

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