2011-10-19 10 views
5

Estoy ejecutando algunos comandos desde la línea de comandos en mi programa java, y parece que no me permite usar "grep"? ¡He probado esto quitando la porción "grep" y el comando funciona perfectamente!El proceso de Java Runtime no se "Grep"

Mi código que no funciona:

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

código que hace el trabajo:

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

¿Por qué es esto? ¿Y hay algún tipo de método correcto o solución alternativa? Soy consciente de que podría analizar todo el resultado, pero me resultaría más fácil hacerlo todo desde la línea de comandos. Gracias.

Respuesta

6

Está tratando de utilizar tuberías que son una función de la carcasa ... y no está utilizando un caparazón; está ejecutando el proceso chkconfig directamente.

La solución más sencilla sería la de exec con el shell y haga que sea hacer de todo:

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

Dicho esto ... ¿por qué la tubería para grep? Simplemente lea la salida de chkconfig y haga los ajustes en java.

+0

No hay razón que no puedo coincidir en Java. Pensé que sería más rápido escribir el grep que analizar la salida. Soy relativamente nuevo con Linux, así que no sabía que grep era una función del shell. ¡Gracias! – Max

+3

@Max: grep no es una shell incorporada, la tubería '|' es una característica de sintaxis de shell. – ninjalj

8

La tubería (como la redirección, o >) es una función del shell, por lo que su ejecución directamente desde Java no funcionará. Es necesario hacer algo como:

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

que ejecuta un proceso de shell dentro de la línea de comandos (incluyendo tuberías) especificada después del -c (entre comillas).

Así que, aquí hay un código de muestra que funciona en mi sistema operativo 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); 
    } 
} 

Aquí, estoy extrayendo todos mis procesos 'Skype' e imprimo el contenido de la secuencia de entrada del proceso.

+0

Hermosa solución !!! –

0

String [] commands = {"bash", "-c", "chkconfig --list | grep" + serviceL}; Proceso p = Runtime.getRuntime(). Exec (comandos);

o si usted está en un env Linux sólo tiene que utilizar grep4j

Cuestiones relacionadas