2010-06-17 5 views
6

से खोल कमांड निष्पादित करना मैं जीएनयू/लिनक्स प्लेटफ़ॉर्म पर जावा एप्लिकेशन से शेल कमांड निष्पादित करने का प्रयास कर रहा हूं। समस्या यह है कि स्क्रिप्ट, जो एक और जावा एप्लिकेशन कहती है, कभी समाप्त नहीं होती है, हालांकि यह सफलतापूर्वक बैश से चलती है। मैंने इसे डीबग करने की कोशिश की:जावा

 
(gdb) bt 
#0 0xb773d422 in __kernel_vsyscall() 
#1 0xb7709b5d in pthread_join (threadid=3063909232, thread_return=0xbf9cb678) at pthread_join.c:89 
#2 0x0804dd78 in ContinueInNewThread() 
#3 0x080497f6 in main() 

मैंने कोशिश की: ProcessBuilder(); और Runtime.getRuntime()। exec (cmd);

ऐसा लगता है कि यह कुछ खत्म होने की प्रतीक्षा करता है। कोई विचार?

धन्यवाद, Laurentiu

+0

आप कह रहे हैं कि दूसरी जावा प्रोग्राम जल्दी से खत्म करने के लिए उम्मीद है, लेकिन यह अभी भी खोल लागू चारों ओर लटका हुआ है? क्या आपने पुष्टि की है कि दूसरी जावा प्रक्रिया वास्तव में समाप्त हो गई है (प्रक्रिया सूची में चकित)? –

+0

हां मैंने प्रक्रिया सूची की जांच की है और प्रक्रिया अभी भी वहां है। मुझे लगता है कि डॉस्मिथ ने मेरे प्रश्न का उत्तर दिया। –

+0

ऐसा लगता है कि जावा से प्रोसेस क्लास बहुत धीमी है। मैंने शैवाल से उत्पादन (गैर-वर्बोज़) पैरामीटर के साथ जावा एप्लिकेशन शुरू किया और यह थोड़ी देर के बाद समाप्त हो गया। –

उत्तर

13

आप मानक इनपुट और मानक उत्पादन प्रसंस्करण कर रहे हैं? javadocs से:

क्योंकि कुछ स्थानीय प्लेटफ़ॉर्म केवल मानक इनपुट और आउटपुट धाराओं के लिए सीमित बफर आकार प्रदान करते हैं, तुरंत इनपुट धारा लिखने या उपप्रक्रिया के उत्पादन धारा को पढ़ने के लिए विफलता को ब्लॉक करने के उपप्रक्रिया कारण हो सकता है, और यहां तक गतिरोध।

Process cmdProc = Runtime.getRuntime().exec(command); 


BufferedReader stdoutReader = new BufferedReader(
     new InputStreamReader(cmdProc.getInputStream())); 
String line; 
while ((line = stdoutReader.readLine()) != null) { 
    // process procs standard output here 
} 

BufferedReader stderrReader = new BufferedReader(
     new InputStreamReader(cmdProc.getErrorStream())); 
while ((line = stderrReader.readLine()) != null) { 
    // process procs standard error here 
} 

int retValue = cmdProc.exitValue(); 
+0

धन्यवाद, यह मेरी समस्या हल हो गया ;-)। अगली बार मुझे दस्तावेज़ीकरण को और सावधानी से पढ़ना चाहिए। –