2011-10-19 24 views
5

Tôi đang thực hiện một số lệnh từ dòng lệnh trong chương trình java của tôi, và có vẻ như nó không cho phép tôi sử dụng "grep"? Tôi đã thử nghiệm điều này bằng cách loại bỏ phần "grep" và lệnh chạy tốt!Java Runtime Process Sẽ không "Grep"

Mã của tôi mà KHÔNG làm việc:

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

Mã mà không làm việc:

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

Tại sao điều này? Và có một số phương pháp đúng hay cách giải quyết khác không? Tôi biết rằng tôi chỉ có thể phân tích cú pháp toàn bộ đầu ra, nhưng tôi sẽ thấy dễ dàng hơn khi làm tất cả từ dòng lệnh. Cảm ơn.

Trả lời

6

Bạn đang cố gắng sử dụng đường ống là chức năng của vỏ ... và bạn không sử dụng vỏ; bạn đang thực hiện quy trình chkconfig trực tiếp.

Các giải pháp dễ dàng sẽ được exec vỏ và có nó làm tất cả mọi thứ:

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

đó đang được nói ... tại sao bạn đường ống để grep? Chỉ cần đọc kết quả đầu ra của chkconfig và thực hiện chính bạn trong java.

+0

Không có lý do gì tôi không thể khớp trong Java. Tôi chỉ đoán nó sẽ nhanh hơn để viết ra grep hơn để phân tích đầu ra. Tôi tương đối mới với Linux vì vậy tôi không biết rằng grep là một chức năng của trình bao. Cảm ơn! – Max

+3

@Max: grep không phải là nội trang hệ vỏ, phần tử '|' là một tính năng cú pháp vỏ. – ninjalj

8

Đường ống (như chuyển hướng hoặc >) là một chức năng của trình bao, do đó việc thực thi nó trực tiếp từ Java sẽ không hoạt động. Bạn cần phải làm một cái gì đó như:

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

mà thực hiện một quá trình shell trong dòng lệnh (bao gồm cả ống) quy định sau khi -c (trong dấu ngoặc kép).

Vì vậy, đây là mã mẫu hoạt động trên hệ điều hành Linux của tôi.

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); 
    } 
} 

Ở đây, tôi trích xuất tất cả quy trình 'Skype' của mình và in nội dung của luồng đầu vào quy trình.

+0

Giải pháp tuyệt vời !!! –

0

Chuỗi [] lệnh = {"bash", "-c", "chkconfig --list | grep" + serviceL}; Quy trình p = Runtime.getRuntime(). Exec (lệnh);

hoặc nếu bạn đang ở trong linux env chỉ cần sử dụng grep4j