2009-03-26 21 views
9

समाप्त नहीं कर रहा है मैं जावा से विंडोज पर एक प्रक्रिया बना रहा हूं। मेरी समस्या यह है कि यह प्रक्रिया समाप्त नहीं होती है। यहां एक नमूना कार्यक्रम है:जावा से निष्पादित विंडोज प्रक्रिया

import java.io.IOException; 

public class Test { 

/** 
* @param args 
* @throws IOException 
* @throws InterruptedException 
*/ 
public static void main(String[] args) throws IOException, 
     InterruptedException { 
    Process process = Runtime.getRuntime().exec("cmd /c dir"); 
    process.waitFor(); 
    } 
} 

मेरी समझ से परे कारणों के लिए, यह प्रोग्राम कभी पूरा नहीं होता है। यह सच है अगर "cmd/c dir" ipconfig के साथ-साथ अन्य चीजों के साथ प्रतिस्थापित किया गया है।

मैं प्रोसेसएक्सप्लोरर का उपयोग करके देख सकता हूं कि जावा सीएमडी प्रक्रिया बनाता है। यह नमूना स्पष्ट रूप से एक सरलीकरण है; मेरे मूल कार्यक्रम में मैंने पाया कि अगर मैं थोड़ी देर बाद process.destroy() को कॉल करता हूं और cmd प्रक्रिया आउटपुट की जांच करता हूं, तो कमांड को सफलतापूर्वक निष्पादित किया जाता है।

मैंने जावा 1.5 और 1.6 के विभिन्न रिलीज़ के साथ यह कोशिश की है। मेरा ओएस विंडोज एक्सपी प्रो, एसपी 2.

उत्तर

9

संभावना है कि आपको केवल प्रक्रिया के stdout और stderr को पढ़ने की आवश्यकता है, या यह आउटपुट बफर भरने के बाद से लटका होगा। यदि आप के लिए stdout stderr अनुप्रेषित यह सबसे आसान है, सुरक्षा के लिए:

public static void main(String[] args) throws IOException, 
       InterruptedException { 
     String[] cmd = new String[] { "cmd.exe", "/C", "dir", "2>&1" }; 
     Process process = Runtime.getRuntime().exec(cmd); 
     InputStream stdout = process.getInputStream(); 
     while(stdout.read() >= 0) { ; } 
     process.waitFor(); 
    } 
} 
9

एक स्पष्टीकरण के लिए इस link देखें।

आपको इनपुट स्ट्रीम को पढ़ने की आवश्यकता है। इसके अलावा जावा प्रक्रिया डॉस खोल की तरह काम नहीं करती है। आप तर्क अपने आप को पारित करने के लिए की जरूरत है:

String[] cmd = new String[3]; 
cmd[0] = "cmd.exe" ; 
cmd[1] = "/C" ; 
cmd[2] = "dir"; 
Runtime rt = Runtime.getRuntime(); 
Process proc = rt.exec(cmd); 
+0

+1 तर्क गुजरने की समस्या को पकड़ने के लिए भी +1। –

+1

आप पूरी तरह से सही नहीं हैं। निष्पादन (स्ट्रिंग) के लिए एपीआई दस्तावेज़ बताते हैं कि "सिस्टम कमांड" की किसी भी करीबी परिभाषा के बिना तर्क "सिस्टम कमांड" है। यह असंभव नहीं है कि JVM बस cmd.exe को स्ट्रिंग पास करता है। – JesperE

+0

उत्तर और लिंक के लिए धन्यवाद! मुझे रविवार को समस्याग्रस्त मशीन पर इसे जांचने का मौका होना चाहिए। दरअसल, तर्क सही ढंग से पारित होते हैं; मैं उन्हें प्रोसेस एक्सप्लोरर में देख सकता हूं। –

0

आप एक ProcessBuilder जिन्हें आप नीचे का उपयोग कर प्रयास करना चाहिए। निश्चित नहीं है कि क्या अलग है लेकिन इसने हमारे लिए बहुत सी समस्याएं हल की हैं।

ProcessBuilder pb = new ProcessBuilder(CMD, ARG1, ARG2); 
Process p = pb.start(); 
संबंधित मुद्दे