2010-06-09 8 views
9

संपादित करें: यह निर्धारित करने के लिए मेरा परीक्षण लगता है कि मूल जेवीएम बाहर निकलने के लिए शुरू हुआ था (स्वीकृत उत्तर पर टिप्पणियां देखें)। शोर के लिए खेद है।जावा का उपयोग करके, क्या मेरे पास एक जेवीएम स्पॉन हो सकता है, और उसके बाद मूल एक बाहर निकल सकता है?

मुझे एक चल रहे JVM को एक और JVM प्रारंभ करने की आवश्यकता है और फिर बाहर निकलें। मैं वर्तमान में Runtime.getRuntime().exec() के माध्यम से ऐसा करने की कोशिश कर रहा हूं। अन्य जेवीएम शुरू होता है, लेकिन मेरा मूल जेवीएम "बच्चे" जेवीएम प्रक्रिया बंद होने तक बाहर नहीं निकलेगा। ऐसा लगता है कि Runtime.getRuntime().exec() का उपयोग प्रक्रियाओं के बीच अभिभावक-बाल संबंध बनाता है। क्या स्पॉन्डेड प्रक्रिया को दोबारा जोड़ने का कोई तरीका है ताकि माता-पिता मर सकते हैं, या किसी अन्य प्रक्रिया को प्रक्रिया प्रक्रिया के किसी भी रिश्ते के बिना उत्पन्न करने के लिए?

ध्यान दें कि यह वास्तव में इस प्रश्न की तरह लगता है: Using Java to spawn a process and keep it running after parent quits लेकिन स्वीकार्य उत्तर वास्तव में मेरे सिस्टम (विंडोज 7, जावा 5 और 6) पर कम से कम काम नहीं करता है। ऐसा लगता है कि शायद यह एक मंच-निर्भर व्यवहार है। मैं एक अन्य प्लेटफॉर्म स्वतंत्र तरीके से अन्य प्रक्रिया को विश्वसनीय रूप से आमंत्रित करने के लिए देख रहा हूं और मेरी मूल प्रक्रिया को मरने देता हूं।

उदाहरण के लिए, मान लीजिए कि मेरे पास C:\myjar.jar पर एक जार फ़ाइल है और मैं कक्षा com.example.RunMe को उस जार में रहना चाहता हूं। आइए कहें कि क्लास जॉप्शनपेन पॉप अप करता है, और उसके बाद उपयोगकर्ता ठीक हो जाता है।

अब, निम्नलिखित कार्यक्रम JVM # 1 में चल रहा है: "। शुरू JVM"

public static void main(String[] args) { 
    String javaHome = System.getProperty("java.home"); 
    String os = System.getProperty("os.name"); 
    String javawBin = javaHome + File.separator + "bin" + File.separator + "javaw"; 

    if (os.toLowerCase().contains("win")) { 
     javawBin += ".exe"; 
    } 

    List<String> cmd = new ArrayList<String>(); 

    cmd.add("\"" + javawBin + "\""); 
    cmd.add("-cp"); 
    cmd.add("\"C:\\myjar.jar\""); 
    cmd.add("com.example.RunMe"); 

    System.out.println("Running: " + cmd); 

    try { 

     System.out.println("Launching..."); 
     Process p = Runtime.getRuntime().exec(cmd.toArray(new String[cmd.size()])); 

     new Thread(new StreamGobbler(p.getInputStream())).start(); 
     new Thread(new StreamGobbler(p.getErrorStream())).start(); 

     System.out.println("Launched JVM."); 

     System.exit(0); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

private static class StreamGobbler implements Runnable { 
    InputStream stream; 

    StreamGobbler(InputStream stream) { 
     this.stream = stream; 
    } 

    public void run() { 
     byte[] buf = new byte[64]; 

     try { 
      while (stream.read(buf) != -1) 
       ; 
     } catch (IOException e) { 

     } 
    } 
} 

मनाया व्यवहार है कि दोनों है "का शुभारंभ ..." और मुद्रित हैं, लेकिन जेवीएम # 1 द्वारा शुरू किए गए जॉप्शनपेन में ठीक होने के बाद JVM # 1 केवल निकलता है। साथ ही - व्यवहार वही है चाहे आप स्ट्रीम गोबेलर धागे को शुरू करें या नहीं।

इसके अलावा, किसी को सांस बचाने के लिए, हाँ मुझे पता है कि मैं उस जार फ़ाइल के साथ एक नया URLClassLoader बना सकता हूं और इसे इस तरह से चला सकता हूं, लेकिन ऐसा नहीं है कि मैं यहां क्या करने की कोशिश कर रहा हूं।

+1

क्या आप नमूना प्रदान कर सकते हैं? – OscarRyz

उत्तर

4

मैंने अभी निम्नलिखित कोड की कोशिश की है, और मुझे लगता है कि प्रक्रियाएं उत्पन्न हो रही हैं और मुख्य रूप से विस्टा और जावा 6 पर निकल रही है। मुझे लगता है कि आपके कोड के साथ कुछ और हो रहा है। इसलिए # 1 प्रक्रिया उन पूरा सूत्र, जब तक खत्म नहीं होता

public class Test { 
    public static void main(String[] args) throws Exception { 
     if(args.length == 0) 
      Runtime.getRuntime().exec("javaw Test loop"); 
     else 
      while(true){} 
    } 
} 
+0

मुझे लगता है कि आप सही हैं। ये रही चीजें। मेरा बैरोमीटर यह जांचने के लिए कि JVM # 1 बाहर निकला है या नहीं, ग्रहण कंसोल में लाल "स्टॉप" बटन सक्रिय था या नहीं, क्योंकि यह अतीत में जेवीएम जीवन का एक विश्वसनीय संकेतक रहा है। हालांकि, विंडोज़ टास्क मैनेजर मुझे एक अलग कहानी दिखा रहा है, अर्थात् JVM # 1 अपेक्षित रूप से बाहर निकलता है। उस ग्रहण बंद बटन को बाल प्रक्रिया से कैसे बंधेगा, फिर? – CarlG

+0

शायद ग्रहण System.exit को समझ में नहीं आता है? – ykaganovich

+0

सभी ग्रहण कर रहा है javaw.exe खुद को spawning है। इसके लटकने के लिए कुछ प्रकार का लिंक होना चाहिए? यह अजीब बात है कि यह कार्य प्रबंधक से गायब हो जाता है। शायद मैंने एक पहाड़ी पर एक पहाड़ बनाया है। – CarlG

0

जहां तक ​​मुझे पता है, एक प्रक्रिया को मारने से अक्सर सभी बाल प्रक्रियाओं को मार दिया जाता है। मुझे संदेह है कि ऐसा करने के लिए एक मंच स्वतंत्र तरीका है।

+0

2 चीजें: 1) क्या कोई प्रक्रिया एक और स्वतंत्र प्रक्रिया हो सकती है जो कि बच्चा नहीं है? और 2) मैं माता-पिता को बिल्कुल मार नहीं सकता। System.exit (0) तब तक लटकता है जब तक बच्चा बंद नहीं हो जाता है। – CarlG

0

विंडोज यूनिक्स सिस्टम की प्रक्रियाओं के बीच समान प्रकार के अभिभावक-बाल संबंध स्थापित नहीं करता है। ऐसा लगता है कि आपकी मूल प्रक्रिया बाहर नहीं जा रही है क्योंकि इसमें अभी भी एक धागा चल रहा है। यह धागा बच्चे की प्रक्रिया को समाप्त करने की प्रतीक्षा कर रहा है, जो यह बता सकता है कि जब बच्चा निकलता है तो आपका माता-पिता क्यों निकलता है।

+0

मूल प्रक्रिया System.exit (0) पर लटकती है। क्या थ्रेड के लिए इंतजार करने के लिए पूर्व-खाली नहीं होगा? साथ ही, यह Win7 में अभी भी सच है? – CarlG

+0

@CarlG: 'System.exit (0)' में लटकना निश्चित रूप से अप्रत्याशित है।मैं कल्पना नहीं करता कि विंडोज 7 में प्रक्रिया समाप्ति के अर्थशास्त्र बदल गए हैं, लेकिन मुझे लगता है कि वे हो सकते हैं। मैं यह देखने के लिए उत्सुक हूं कि इस के लिए अंतिम समाधान क्या है। –

0

आपका धागे StreamGobblers चल # 1 प्रक्रिया के भीतर हैं, और डेमॉन धागे नहीं हैं, जब स्ट्रीम वे प्रक्रिया # 2 समाप्त होता है के रूप में दूर जाना gobbling कर रहे हैं।

उन धागे को बनाने वाली दो पंक्तियां निकालें।

+0

यह मेरा पहला वृत्ति था, लेकिन मुझे लगता है कि System.exit (0) को चलने वाले थ्रेड का ख्याल रखना चाहिए। लेकिन Runtime.exit दस्तावेज पढ़ना, मुझे आश्चर्य है कि एक अलग त्रुटि कोड के परिणामस्वरूप एक अलग व्यवहार होगा। – ykaganovich

+0

उचित, लेकिन जैसा कि मैंने उपरोक्त इंगित किया है, उन 2 लाइनों को निकालने का कोई प्रभाव नहीं पड़ता है। – CarlG

+0

ठीक है, क्षमा करें। कॉलिंग 'System.exit (0)' उन धागे का ख्याल रखती है। –

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

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