2012-12-04 11 views
10

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

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    String nfdump = "nfdump -o csv -r /home/shane/Documents/nfdump/nfcapd.201211211526>blank.txt"; 

    try { 
     FileWriter fw = new FileWriter("/home/shane/Documents/script.sh"); 

     PrintWriter pw = new PrintWriter(fw); 

     pw.println("#!/bin/bash"); 
     pw.println(nfdump); 

     pw.close(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

    Process proc = null; 

    try { 
     proc = Runtime.getRuntime().exec("sh /home/shane/Documents/script.sh"); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+3

Runtime.getRuntime के बजाय ProcessBuilder() पर एक नज़र डालें ... जब मैं इस का उपयोग मैं कम समस्याओं है लगता है और चीजों को थोड़ा अधिक undestandable – RNJ

+1

जिज्ञासु दिखाई कारण है कि आप सीधे 'क्रियान्वित नहीं कर रहे हैं –

+0

nfdump' मैं अपने जीयूआई से एनएफडम्प का उपयोग करने में सक्षम होना चाहता हूं, यह उस सॉफ्टवेयर का हिस्सा है जिसका मैं निर्माण कर रहा हूं – Shane

उत्तर

25

आप वापस आ Process का उपयोग परिणाम प्राप्त करने चाहिए।

कमांड को एक अलग प्रक्रिया के रूप में निष्पादित करता है और Process प्रकार का ऑब्जेक्ट देता है। आपको Process#waitFor पर कॉल करना चाहिए ताकि आपका प्रोग्राम नई प्रक्रिया समाप्त होने तक प्रतीक्षा कर सके। फिर, आप निष्पादित कमांड के आउटपुट का निरीक्षण करने के लिए Process ऑब्जेक्ट पर Process.html#getOutputStream() का आह्वान कर सकते हैं।

प्रक्रिया बनाने का एक वैकल्पिक तरीका ProcessBuilder का उपयोग करना है।

Process p = new ProcessBuilder("myCommand", "myArg").start(); 

एक ProcessBuilder के साथ, आप अलग तर्कों के रूप आदेश के तर्कों की सूची।

Difference between ProcessBuilder and Runtime.exec() और ProcessBuilder vs Runtime.exec()Runtime#exec और ProcessBuilder#start बीच अंतर के बारे में अधिक जानने के लिए देखें।

+0

के लिए भी आरएनजे के लिए धन्यवाद धन्यवाद! Processbuilder पूरी तरह से काम किया! – Shane

+1

असल में, यदि आप उपप्रोसेस के आउटपुट को पुनर्प्राप्त करना चाहते हैं तो आपको ['प्रक्रिया # getInputStream()'] (http://docs.oracle.com/javase/7/docs/api/) पर कॉल करना होगा जावा/लैंग/Process.html # getInputStream% 28% 2 9), जो प्रक्रिया आउटपुट स्ट्रीम के लिए पाइप। –

4

इसे आज़माएं, यह काम करेगा।

String[] cmd = new String[]{"/bin/sh", "path/to/script.sh"}; 
Process pr = Runtime.getRuntime().exec(cmd); 
3

जब आप एक स्क्रिप्ट जावा से यह एक नया खोल जहां पथ वातावरण चर सेट नहीं है spawns निष्पादित।

नीचे दिए गए कोड का उपयोग करके पाथ एनवी चर सेट करने से आपकी स्क्रिप्ट चलनी चाहिए।

String[] env = {"PATH=/bin:/usr/bin/"}; 
String cmd = "you complete shell command"; //e.g test.sh -dparam1 -oout.txt 
Process process = Runtime.getRuntime().exec(cmd, env);