2011-10-19 20 views
5

Jestem wykonywania niektórych poleceń z wiersza polecenia w moim programie java i wydaje się, że nie pozwala mi używać "grep"? Przetestowałem to przez usunięcie części "grep" i polecenie działa dobrze!Proces Java Runtime nie będzie "Grep"

mój kod, który nie działa:

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

Kod, który działa:

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

Dlaczego tak jest? Czy istnieje jakaś poprawna metoda lub obejście? Jestem świadomy, że mógłbym po prostu przeanalizować cały wynik, ale łatwiej byłoby zrobić to wszystko z poziomu wiersza poleceń. Dzięki.

Odpowiedz

6

Próbujesz użyć orurowania, które jest funkcją powłoki ... i nie używasz powłoki; uruchamiasz proces chkconfig bezpośrednio.

Proste rozwiązanie byłoby exec powłoki i mają to zrobić wszystko:

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

Powiedział, że jest ... dlaczego orurowanie grep? Po prostu przeczytaj dane wyjściowe z chkconfig i dopasuj się do java.

+0

bez powodu, że nie może się równać w Javie. Po prostu pomyślałem, że szybciej będzie napisać grep niż parsować wynik. Jestem stosunkowo nowy w Linuksie, więc nie zdawałem sobie sprawy, że grep był funkcją powłoki. Dzięki! – Max

+3

@Max: grep nie jest wbudowaną powłoką, potok '|' jest funkcją składni powłoki. – ninjalj

8

Rura (podobnie jak przekierowanie lub >) jest funkcją powłoki, więc wykonanie jej bezpośrednio z Java nie będzie działać. Musisz zrobić coś takiego:

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

który wykonuje proces powłoki w wierszu poleceń (łącznie z rurami) określony po -c (w cudzysłowie).

Oto przykładowy kod, który działa na moim systemie Linux.

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

Tutaj wydobywam wszystkie moje procesy "Skype" i drukuję zawartość strumienia wejściowego procesu.

+0

Piękne rozwiązanie !!! –

0

Łańcuch [] komendy = {"bash", "-c", "chkconfig - lista | grep" + usługaL}; Proces p = Runtime.getRuntime(). Exec (polecenia);

lub jeśli jesteś w env linux wystarczy użyć grep4j

Powiązane problemy