Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

203
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!