2013-08-04 7 views
6

मैं एक कोड लिखने कि Runtime.getRuntime().exec("java -jar MyServerRunner -port MYPORT"); जावा:। Runtime.getRuntime() द्वारा runned प्रक्रिया को मारने के कार्यकारी()

  • साथ

    1. रन यूनिक्स प्रक्रिया की जरूरत है जावा से कमांड को क्रियान्वित प्रक्रिया के पीआईडी ​​लगता है कोड lsof -t -i: MYPORT
    2. और
    3. (भी जावा कोड से कमांड को क्रियान्वित) पीआईडी ​​kill -9 PID द्वारा उसे मारने और फिर दूसरों को अंजाम आदेश

    लेकिन

    अगर मैं Runtime.getRuntime().exec() द्वारा इस आदेश पर अमल मेरा कार्यक्रम बाहर निकलने के कोड 137 के साथ बाहर निकल जाता है - इसका मतलब है कि मैं मेरे जावा programm की प्रक्रिया को मारने जब मैं Runtime.getRuntime().exec("kill -9 PID") चलाते हैं, लेकिन कार्यक्रम नहीं, कि मैं कोड से चलाते हैं।

    मैं केवल उस प्रक्रिया को कैसे मार सकता हूं जो मैं कोड से चलाता हूं?

    पीएस शायद मुझे Processbuilder का उपयोग करना चाहिए?

  • +2

    यदि आप किसी अन्य जावा प्रक्रिया को चलाने के लिए 'Runtime.getRuntime()' का उपयोग कर रहे हैं तो आप कुछ गलत कर रहे हैं। आप कक्षा को 'थ्रेड' में क्यों नहीं चला सकते? –

    +0

    1. और यदि आप '-9' के साथ प्रक्रियाओं को मार रहे हैं तो आप कुछ भी गलत कर रहे हैं। अगर प्रक्रिया में एक बंदरगाह है तो उसे शट डाउन कमांड भी होना चाहिए जिसे उस बंदरगाह पर भेजा जा सकता है। 'kill -9' एक व्यवस्थापक के लिए अंतिम उपाय का एक कार्य है जो जानता है कि वह क्या कर रहा है (और इसे लॉग करता है)। इसे अनुप्रयोगों में नहीं बनाया जाना चाहिए। 2. तथ्य यह है कि शुरू की गई जावा प्रक्रिया '137' के साथ निकलती है, इस तथ्य से कोई लेना-देना नहीं है कि आप गलत प्रक्रिया को मार रहे हैं। – EJP

    उत्तर

    10

    आप एक उप प्रक्रिया है जो आपको destroy के साथ अपने जावा आवेदन से शुरू किया है को मार सकता है:

    Process p = Runtime.getRuntime().exec("java -jar MyServerRunner -port MYPORT"); 
    p.destroy(); 
    

    भी ध्यान रखें कि यह एक अलग थ्रेड में है कि अन्य कोड को चलाने के लिए कोई मतलब हो सकता है बल्कि एक अलग की तुलना में प्रक्रिया।

    1

    आप .exec("ps|grep <your process name>"); उपयोग कर सकते हैं, और फिर पीआईडी, अंत में .exec("kill PID");

    इसलिए, अपने प्रक्रिया मार दिया जाता है लेकिन Android एप्लिकेशन अभी भी जीवित पाने के लिए परिणाम पार्स।

    +0

    क्या आप कृपया स्पष्ट कर सकते हैं कि पीआईडी ​​कैसे प्राप्त करें? , छोटे सुधार ps भी है grep – vikramvi

    +0

    http://alvinalexander.com/java/edu/pj/pj010016 यही वह है जिसे मैं ढूंढ रहा था। आपके उत्तर के साथ यह पीआईडी ​​देता है जो कमांड लाइन पीआईडी ​​से मेल नहीं खाता है। मुझे यकीन नहीं है क्यों? स्ट्रिंग एस = शून्य; \t प्रक्रिया पी = रनटाइम .getRuntime()। Exec ("pgrep -f सेलेनियम-सर्वर-स्टैंडअलोन"); \t \t BufferedReader stdInput = नया BufferedReader (नया \t इनपुटस्ट्रीम रीडर (p.getInputStream())); \t \t जबकि ((एस = stdInput.readLine())! = शून्य) { \t System.out.println (ओं); \t} – vikramvi

    0

    आप यूनिक्स में प्रतिबिंब के साथ पिड प्राप्त कर सकते हैं (मुझे पता है कि यह एक बुरा विचार है :)) और कॉल मारो;

    Process proc = Runtime.getRuntime().exec(
        new String[] {"java","-classpath",System.getProperty("java.class.path"),... }); 
    Class<?> cProcessImpl = proc.getClass(); 
    Field fPid = cProcessImpl.getDeclaredField("pid"); 
    if (!fPid.isAccessible()) { 
        fPid.setAccessible(true); 
    } 
    Runtime.getRuntime().exec("kill -9 " + fPid.getInt(proc)); 
    
    संबंधित मुद्दे