Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

202
Visualizações
Obtener resultados de la ejecución de un comando de terminal en un código Java que se ejecuta dentro de Cubieboard Platform

El código que estoy usando para ejecutar un comando de terminal en Linux Debian y obtener el resultado dentro de un programa Java es este:

 public static String execute(String command) { StringBuilder sb = new StringBuilder(); String[] commands = new String[]{"/bin/sh", "-c", command}; try { Process proc = new ProcessBuilder(commands).start(); BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream())); BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream())); String s = null; while ((s = stdInput.readLine()) != null) { sb.append(s); sb.append("\n"); } while ((s = stdError.readLine()) != null) { sb.append(s); sb.append("\n"); } } catch (IOException e) { return e.getMessage(); } return sb.toString(); }

Ahora el problema es que funciona para comandos normales como ls / y devuelve el resultado apropiado. Pero mi objetivo es ejecutar comandos como:

 echo 23 > /sys/class/gpio/export

que es, por ejemplo, para activar el pin gpio en la plataforma CubieBoard. (Cubieboard es una placa mini-pc como Raspberry Pi).

Ahora, ejecutar este comando en la terminal del sistema en sí, funciona bien y me da el resultado adecuado. Pero cuando lo ejecuto desde este código Java, no puedo obtener ningún resultado.

El punto es que funciona y el comando se ejecuta bien, ¡pero solo que no puedo obtener el mensaje de salida del comando!

Por ejemplo, si el pin estaba activo desde el pasado, normalmente debería devolverme el resultado como:

 bash: echo: write error: Device or resource busy

Pero cuando ejecuto este comando a través del código Java anterior, no recibo ninguna respuesta. (nuevamente surte efecto, ¡pero solo la respuesta de la terminal no la puedo obtener!)

Cuando ejecuto el código, tanto las variables stdInput como stdError en el código tienen el valor null . :(

Por favor, ayúdame para que pueda terminar mi proyecto. esta es la única parte que queda :(

Gracias.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Tal vez el childProcess no se ejecuta hasta el final

Por favor, prueba:

proc.esperar()

y ejecute read stdInput y stdError en otro subproceso antes de proc.waitFor() .

Ejemplo:

 public static String execute(String command) { String[] commands = new String[] { "/bin/sh", "-c", command }; ExecutorService executor = Executors.newCachedThreadPool(); try { ProcessBuilder builder = new ProcessBuilder(commands); /*- Process proc = builder.start(); CollectOutput collectStdOut = new CollectOutput( proc.getInputStream()); executor.execute(collectStdOut); CollectOutput collectStdErr = new CollectOutput( proc.getErrorStream()); executor.execute(collectStdErr); // */ // /*- // merges standard error and standard output builder.redirectErrorStream(); Process proc = builder.start(); CollectOutput out = new CollectOutput(proc.getInputStream()); executor.execute(out); // */ // child proc exit code int waitFor = proc.waitFor(); return out.get(); } catch (IOException e) { return e.getMessage(); } catch (InterruptedException e) { // proc maybe interrupted e.printStackTrace(); } return null; } public static class CollectOutput implements Runnable { private final StringBuffer buffer = new StringBuffer(); private final InputStream inputStream; public CollectOutput(InputStream inputStream) { super(); this.inputStream = inputStream; } /* * (non-Javadoc) * * @see java.lang.Runnable#run() */ @Override public void run() { BufferedReader reader = null; String line; try { reader = new BufferedReader(new InputStreamReader(inputStream)); while ((line = reader.readLine()) != null) { buffer.append(line).append('\n'); } } catch (Exception e) { System.err.println(e); } finally { try { reader.close(); } catch (IOException e) { } } } public String get() { return buffer.toString(); } }
over 4 years ago · Santiago Trujillo Relatório

0

el código es correcto, solo en la segunda línea, cambié

 "/bin/sh" to "/bin/bash"

¡Y todo funciona!

sh == golpe?

Durante mucho tiempo, /bin/sh solía apuntar a /bin/bash en la mayoría de los sistemas GNU/Linux. Como resultado, casi se había vuelto seguro ignorar la diferencia entre los dos. Pero eso empezó a cambiar recientemente.

Algunos ejemplos populares de sistemas en los que /bin/sh no apunta a /bin/bash (y en algunos de los cuales /bin/bash ni siquiera existe) son:

  1. Los sistemas Debian y Ubuntu modernos, que vinculan sh a dash de forma predeterminada;

  2. Busybox, que normalmente se ejecuta durante el arranque del sistema Linux como parte de initramfs. Utiliza la implementación de shell de ceniza.

  3. BSD. OpenBSD usa pdksh, un descendiente del shell Korn. El sh de FreeBSD es descendiente del shell original de UNIX Bourne.

Para obtener más información sobre esto, consulte: Diferencia entre sh y bash

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda