Saltar al contenido

¿Cómo hacer que las tuberías funcionen con Runtime.exec ()?

Hola, hemos encontrado la solución a tu interrogante, has scroll y la obtendrás aquí.

Solución:

Escriba un script y ejecútelo en lugar de comandos separados.

Pipe es una parte del caparazón, por lo que también puedes hacer algo como esto:

String[] cmd = 
"/bin/sh",
"-c",
"ls /etc ;

Process p = Runtime.getRuntime().exec(cmd);

Me encontré con un problema similar en Linux, excepto que era “ps -ef | grep someprocess”.
Al menos con “ls” tiene un reemplazo de Java independiente del idioma (aunque más lento). P.ej.:

File f = new File("C:\");
String[] files = f.listFiles(new File("/home/tihamer"));
for (String file : files) 
    if (file.matches(.*some.*))  System.out.println(file); 

Con “ps”, es un poco más difícil, porque Java no parece tener una API para ello.

Escuché que Sigar podría ayudarnos: https://support.hyperic.com/display/SIGAR/Home

Sin embargo, la solución más simple (como señaló Kaj) es ejecutar el comando canalizado como un string array. Aquí está el código completo:

try 
    String line;
    String[] cmd =  "/bin/sh", "-c", "ps -ef ;
    Process p = Runtime.getRuntime().exec(cmd);
    BufferedReader in =
            new BufferedReader(new InputStreamReader(p.getInputStream()));
    while ((line = in.readLine()) != null) 
        System.out.println(line); 
    
    in.close();
 catch (Exception ex) 
    ex.printStackTrace();

En cuanto a por qué la cadena array funciona con tubería, mientras que una sola string no… es uno de los misterios del universo (especialmente si no has leído el código fuente). Sospecho que es porque cuando al ejecutivo se le da un solo string, lo analiza primero (de una manera que no nos gusta). Por el contrario, cuando al ejecutivo se le da una string arraysimplemente lo pasa al sistema operativo sin analizarlo.

En realidad, si nos tomamos un tiempo de un día ajetreado y miramos el código fuente (en http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/ Runtime.java#Runtime.exec%28java.lang.String%2Cjava.lang.String[]%2Cjava.io.File%29), encontramos que eso es exactamente lo que está sucediendo:

public Process  [More ...] exec(String command, String[] envp, File dir) 
          throws IOException 
    if (command.length() == 0)
        throw new IllegalArgumentException("Empty command");
    StringTokenizer st = new StringTokenizer(command);
    String[] cmdarray = new String[st.countTokens()];
    for (int i = 0; st.hasMoreTokens(); i++)
        cmdarray[i] = st.nextToken();
    return exec(cmdarray, envp, dir);

Cree un tiempo de ejecución para ejecutar cada uno de los procesos. Obtenga el OutputStream del primer tiempo de ejecución y cópielo en el InputStream del segundo.

Tienes la opción de añadir valor a nuestra información contribuyendo tu veteranía en las interpretaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *