Java ejecutando el comando RSYNC Shell con pantalla de progreso -- java campo con shell campo con unix campo con child-process camp codereview Relacionados El problema

Java executing rSync shell command with progress display


1
vote

problema

Español

Básicamente quiero escribir un programa de GUI simple para sincronizar a los directorios utilizando el comando 9988776665544331 . La parte central del código está a continuación. Mi pregunta principal es, ¿necesito tener el método 99887766655544332 ? En la actualidad, lo he dejado fuera, porque me gustaría mostrarle al usuario el --progress respuestas que lo haría en el terminal, no espere hasta el final. ¿Es una mala idea?

  public void executeCommand(String src, String dest) {         System.out.println("Starting shell");     Process p;     try {                 System.out.println("Creating process...");         p = Runtime.getRuntime().exec("rsync --progress -va "+src +" "+ dest );         //p.waitFor(); <- is this important?                     System.out.println("Creating reader...");         BufferedReader reader =                         new BufferedReader(new InputStreamReader(p.getInputStream()));                                            String line = "";                     System.out.println("Starting sync...");         while ((line = reader.readLine())!= null) {                                          System.out.println(line);                                                           textAreaAppend(line);            }      } catch (Exception e) {         e.printStackTrace();     } }     public void textAreaAppend(String line){     textArea.append(line +" "); }   
Original en ingles

I basically want to write a simple GUI program to sync to directories using the rsync command. The core part of the code is below. My main question is, do I need to have the waitFor method included? At present, I have left it out, because I would like to show the user the --progress responses as it would in terminal, not wait until the end. Is this a bad idea?

public void executeCommand(String src, String dest) {         System.out.println("Starting shell");     Process p;     try {                 System.out.println("Creating process...");         p = Runtime.getRuntime().exec("rsync --progress -va "+src +" "+ dest );         //p.waitFor(); <- is this important?                     System.out.println("Creating reader...");         BufferedReader reader =                         new BufferedReader(new InputStreamReader(p.getInputStream()));                                            String line = "";                     System.out.println("Starting sync...");         while ((line = reader.readLine())!= null) {                                          System.out.println(line);                                                           textAreaAppend(line);            }      } catch (Exception e) {         e.printStackTrace();     } }     public void textAreaAppend(String line){     textArea.append(line +"\n"); } 
           

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Process.waitfor Terminará el hilo actual hasta que finalice el proceso. Así, en el lugar donde lo comentó, no tiene ningún sentido en absoluto. Puede considerar poner un P.WaitFor () después de el bucle, como continuar con su programa solo cuando el proceso haya terminado.

Aparte de eso, lamento decirlo, su código es un desastre. Utiliza un método muy desactualizado para iniciar el proceso, no lee el STDERR (que puede llevar a condiciones de bloqueo en STDOUT), el formato de código está en todo el lugar, P se declara fuera del bloque Intenta sin ninguna razón, el manejo de excepciones no es presente.

Para cubrir al menos las necesidades básicas de leer tanto STDIN como STDERR, debe ir a Process Builder y redirigir STDERR a STDOUT:

      ProcessBuilder builder = new ProcessBuilder(Arrays.asList("rsync", "--progress", "-va", src, dest));     builder.redirectErrorStream(true);     builder.redirectOutput(ProcessBuilder.Redirect.PIPE);     Process p = builder.start();   
 

Process.waitFor will terminate the current thread until the process is terminated. Thus, at the place where you commented it out, it does not make any sense at all. You might consider putting a p.waitFor() after the loop, as to continue with your program only when the process has terminated.

Apart from that, sorry to say so, your code is a mess. You use a very outdated method to start the process, you do not read stderr (which may lead to blocking conditions on stdout), code format is all over the place, p is declared outside the try block without any reason, exception handling is not present.

To at least cover the basic necessities of reading both stdin and stderr, you should go for process builder and redirect stderr to stdout:

    ProcessBuilder builder = new ProcessBuilder(Arrays.asList("rsync", "--progress", "-va", src, dest));     builder.redirectErrorStream(true);     builder.redirectOutput(ProcessBuilder.Redirect.PIPE);     Process p = builder.start(); 
 
 
   
   

Relacionados problema

19  Encienda automáticamente la computadora de Raspberry Pi (según la presencia del usuario en el hogar)  ( Automatically turn on computer from raspberry pi based on user presence in home ) 
Sé que el código está lleno de datos inútiles y errores de estilismo y análisis, y realmente me encantaría y apreciaría tener una idea de un profesional para ...

3  Ejecutando XInput para cambiar la configuración de TouchPad  ( Running xinput to change touchpad settings ) 
Estoy buscando algunos comentarios sobre el código a continuación, principalmente para la corrección de la eficiencia o del mecanismo (como eval vs. subproce...

3  FFMPEG con envoltura Java  ( Ffmpeg with java wrapper ) 
En esta aplicación Java, estoy tratando de convertir un video en pequeños clips. Aquí está la clase de implementación para el mismo package ffmpeg.clip.p...

6  Mostrando un trabajo programado bajo un tiempo programado  ( Displaying a scheduled job under a scheduled time ) 
Yo uso at Para programar trabajos y 9988776655544331 para mostrar los trabajos programados. Pero me irrita levemente a eso, tengo que buscar cada trabajo ...

5  Portabilidad y "Rincón oscuro" Gotchas en este programa "WatchDog"  ( Portability and dark corner gotchas in this watchdog program ) 
El siguiente programa está destinado a "vigilando" un proceso secundario, y todos los subprocesos, el niño engendra . El comportamiento previsto es: Un ...

18  Ejecutora de Python que mata procesos después de un tiempo de espera  ( Python executer that kills processes after a timeout ) 
Imagine que desea ejecutar un montón de tareas en paralelo, pero no puede estar seguro de que todas de sus tareas finalmente terminarán o más bien decidan c...

59  Redirigiendo la salida de subprocesos (STDOUT y STDERR) al módulo de registro  ( Redirecting subprocesses output stdout and stderr to the logging module ) 
Estoy trabajando en un script de Python y estaba buscando un método para redirigir stdout y stderr de un subproceso al módulo de registro. El subproceso s...

10  Script de Ruby en todos los nodos, corren no solo para la enseñanza  ( Ruby script on all nodes run not only for teaching ) 
Escribí el siguiente script de Ruby hace varios años y lo he estado usando a menudo desde entonces en un clúster de computadora bioinformática. Extrae una l...

4  Nstask con git  ( Nstask with git ) 
Esta es mi primera aplicación de cacao real que estoy escribiendo. La primera versión de esta aplicación fue solo una manzana larga. Así que en mi aplicación ...

5  Programa Python que hace pings y sale una respuesta en Tkinter  ( Python program that pings and outputs a response in tkinter ) 
Tengo un programa que me permite verificar (de una manera más bonita que usar el símbolo del sistema). Sin embargo, he implementado todos los elementos que es...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos