"TERM"

2009-09-11 6 views
15

का उपयोग करके सिग्नल हैंडलिंग मेरे पास एक स्टैंडअलोन एप्लिकेशन है जिसमें मुझे उपयोगकर्ता द्वारा किए गए परिवर्तनों को सहेजने के लिए एक पुष्टिकरण संवाद बॉक्स के साथ संकेत देना होगा जब वह start-->shutdown द्वारा सिस्टम को बंद करने का प्रयास करता है।"TERM"

मुझे पता चला कि signalhandlers का उपयोग करके हम इसे कर सकते हैं।
कुछ एक मेरी मदद कर सकते हैं कि कैसे संकेत संचालकों

+1

कैसे SIGINT सवाल से निपटने के लिए: http://stackoverflow.com/questions/2541475/capture- sigint-in-java –

उत्तर

33

अद्यतन मई 2012 (2 और आधे साल बाद)

Trejkaz टिप्पणियों का उपयोग करने के लिए:

इस संकेत से निपटने कोड कारण विफल रहता है जावा के वर्तमान संस्करण पर "INT" सिग्नल "वीएम या ओएस द्वारा आरक्षित है"।
इसके अतिरिक्त, जब कोई एप्लिकेशन बंद करने का अनुरोध करता है तो अन्य वैध सिग्नल नामों में से कोई भी वास्तव में आग नहीं लगाता है (मैंने केवल उन सभी को दर्दनाक रूप से परीक्षण किया है जिन्हें मैं ढूंढ सकता हूं ...)
शट डाउन हुक ज्यादातर काम करता है लेकिन हम पाते हैं कि हमारे मामले में यह फायरिंग नहीं है, इसलिए अगले कदम के पीछे JVM की पीठ

अध्याय "Integrating Signal and Exception Handling" "Troubleshooting Guide for HotSpot VM" के संकेतों का उल्लेख है "SIGTERM, SIGINT, SIGHUP" एक हैंडलर पंजीकृत करने का सहारा लेना जाहिर है केवल सोलारिस ओएस और लिनक्स के लिए।
विंडोज़ पर केवल अपवाद हैंडलिंग का उल्लेख किया गया है।


मूल जवाब (सितम्बर 2009)

एक ShutdownHook उस मामले

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
    public void run() { 
     // what you want to do 
    } 
})); 

(caveats के साथ)
भी देखें संभालने के लिए सक्षम होना चाहिए:

सरल संकेत से निपटने का एक उदाहरण के रूप में:

public class Aaarggh { 
    public static void main(String[] args) throws Exception { 
    Signal.handle(new Signal("INT"), new SignalHandler() { 
     public void handle(Signal sig) { 
     System.out.println(
      "Aaarggh, a user is trying to interrupt me!!"); 
     System.out.println(
      "(throw garlic at user, say `shoo, go away')"); 
     } 
    }); 
    for(int i=0; i<100; i++) { 
     Thread.sleep(1000); 
     System.out.print('.'); 
    } 
    } 
} 
+0

कूल - लेकिन यह सूरज पर निर्भर करता है। मिस्क। * पेड़, जिसे अब हटा दिया गया है। और वर्तमान वर्ग के बारे में संकेत देता है कि हमें क्या उपयोग करना चाहिए? – zigdon

+0

@zigdon: वास्तव में, निश्चित रूप से नहीं। वे कक्षाएं अभी भी jdk या openjdk में हैं, http://www.docjar.com/docs/api/sun/misc/SignalHandler.html, और भले ही वे समर्थित, सार्वजनिक इंटरफ़ेस का हिस्सा नहीं हैं (http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html), लेकिन अन्य समाधानों में JVMTI या JMX शामिल हो सकता है (http://stackoverflow.com/questions/5023520/sending-signals-to-a -running-jvm) – VonC

+1

जावा के वर्तमान संस्करणों पर यह सिग्नल हैंडलिंग कोड विफल रहता है क्योंकि "आईएनटी" सिग्नल "वीएम या ओएस द्वारा आरक्षित" है। इसके अतिरिक्त, जब कोई एप्लिकेशन बंद करने का अनुरोध करता है तो अन्य वैध सिग्नल नामों में से कोई भी वास्तव में आग नहीं लगाता है (मैंने केवल उन सभी का दर्दनाक परीक्षण किया है जिन्हें मैं ढूंढ सकता हूं ...) शटडाउन हुक ज्यादातर काम करता है लेकिन हम पाते हैं कि हमारे मामले में यह फायरिंग नहीं है, इसलिए अगला कदम स्पष्ट रूप से जेवीएम की पीठ के पीछे एक हैंडलर को पंजीकृत करने का सहारा लेना है। :) – Trejkaz

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