2011-10-19 18 views
5

मैं अपने जावा प्रोग्राम में कमांड लाइन से कुछ कमांड निष्पादित कर रहा हूं, और ऐसा लगता है कि यह मुझे "grep" का उपयोग करने की अनुमति नहीं देता है? मैंने इसका परीक्षण "grep" भाग को हटाकर किया है और कमांड ठीक है!जावा रनटाइम प्रक्रिया "Grep" नहीं होगी

मेरे कोड वह काम नहीं करता:

String serviceL = "someService"; 
Runtime rt = Runtime.getRuntime(); 
Process proc = rt.exec("chkconfig --list | grep " + serviceL); 

कोड है कि करता है काम:

Runtime rt = Runtime.getRuntime(); 
Process proc = rt.exec("chkconfig --list"); 

ऐसा क्यों है? और क्या कोई सही विधि या कामकाज है? मुझे पता है कि मैं सिर्फ पूरे आउटपुट को पार्स कर सकता हूं, लेकिन मुझे कमांड लाइन से यह करना आसान लगेगा। धन्यवाद।

उत्तर

6

आप पाइपिंग का उपयोग करने की कोशिश कर रहे हैं जो खोल का एक कार्य है ... और आप एक खोल का उपयोग नहीं कर रहे हैं; आप chkconfig प्रक्रिया को सीधे निष्पादित कर रहे हैं।

आसान उपाय खोल exec करने के लिए होगा और यह सब कुछ करने के है

Process proc = rt.exec("/bin/sh -c chkconfig --list | grep " + serviceL); 

कहा जा रहा है ... तुम क्यों grep के लिए पाइप कर रहे हैं? बस chkconfig के आउटपुट को पढ़ें और अपने आप को जावा में मिलान करें।

+0

कोई कारण नहीं है कि मैं जावा में मेल नहीं कर सकता। मैंने सोचा कि उत्पादन को पार्स करने के बजाय grep को लिखना तेज़ होगा। मैं लिनक्स के साथ अपेक्षाकृत नया हूं इसलिए मुझे पता नहीं था कि grep खोल का एक कार्य था। धन्यवाद! – Max

+3

@ मैक्स: grep एक खोल निर्मित नहीं है, पाइप '|' एक शेल वाक्यविन्यास सुविधा है। – ninjalj

8

पाइप (जैसे पुनर्निर्देशन, या >) खोल का एक कार्य है, और इसलिए जावा से सीधे इसे निष्पादित करना काम नहीं करेगा।

/bin/sh -c "your | piped | commands | here" 

जो (पाइप सहित) कमांड लाइन के भीतर एक खोल प्रक्रिया निष्पादित करता -c (उद्धरण में) के बाद निर्दिष्ट: आप की तरह कुछ करने की ज़रूरत है।

तो, यहां एक नमूना कोड है जो मेरे लिनक्स ओएस पर काम करता है।

public static void main(String[] args) throws IOException { 
    Runtime rt = Runtime.getRuntime(); 
    String[] cmd = { "/bin/sh", "-c", "ps aux | grep skype" }; 
    Process proc = rt.exec(cmd); 
    BufferedReader is = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
    String line; 
    while ((line = is.readLine()) != null) { 
     System.out.println(line); 
    } 
} 

यहाँ, मैं अपने सभी 'स्काइप' प्रक्रियाओं निकालने कर रहा हूँ और इस प्रक्रिया इनपुट धारा की सामग्री मुद्रित करें।

+0

सुंदर समाधान !!! –

0

स्ट्रिंग [] आदेश = {"बाश", "-सी", "chkconfig --list | grep" + serviceL}; प्रक्रिया पी = Runtime.getRuntime()। Exec (आदेश);

या यदि आप लिनक्स एनवी में हैं तो grep4j