Mi programa Java se cuelga después de llamar a un comando de shell

He escrito un pequeño programa para iniciar Hive Server. El comando para iniciar Hive Server está en el archivo de shell. Cuando llamo al archivo de shell para iniciar Hive Server, tiende a iniciarlo y se bloquea. ¿Hay algún problema en el programa?

Código:

            try
        {
            String cmd = "/home/hadoop/sqoop-1.3.0-cdh3u1/bin/StartServer.sh"; // this is the command to execute in the Unix shell

            // create a process for the shell
            ProcessBuilder pb = new ProcessBuilder("bash", "-c", cmd);
            pb.redirectErrorStream(true); // use this to capture messages sent to stderr
            Process shell = pb.start();
            InputStream shellIn = shell.getInputStream(); // this captures the output from the command
            // wait for the shell to finish and get the return code
            // at this point you can process the output issued by the command

            // for instance, this reads the output and writes it to System.out:
            int c;
            while ((c = shellIn.read()) != -1) 
            {
                System.out.write(c);
            }

            // close the stream
            shellIn.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
            e.printStackTrace(pw);
            pw.flush();
            System.exit(1);
        }

Por favor, hágamelo saber. ¿Hay algo que me perdí en el programa?

Gracias.

preguntado el 03 de mayo de 12 a las 11:05

¿Por qué estás leyendo desde la entrada del shell? ¿No deberías estar leyendo su salida? -

está iniciando un servidor que no saldrá. Por lo tanto, su programa se repetirá dentro del ciclo while. Si solo desea iniciar el servidor, use este enfoque:java-muestras.com/showtutorial.php?tutorialid=8 -

@PaulTomblin: estoy leyendo porque quiero imprimir todo el proceso en la consola. Eso no era necesario. Tuerca debido a la lectura, ¿crea el problema? -

alternativamente, si realmente desea controlar el proceso, haga todo esto en un hilo separado para que su hilo se bloquee y no todo su programa:

puede ver la salida del servidor que desea ver, ¿verdad? -

2 Respuestas

Parece que su programa está haciendo lo que le ha dicho que haga.

De hecho, las primeras líneas deberían iniciar el servidor de Hive. Las líneas siguientes, se leen de la salida estándar del proceso del servidor y repiten cada carácter en la consola de su proceso Java. Su proceso de Java se encuentra en un bucle (realizando llamadas de E/S de bloqueo) mientras exista el flujo de salida del servidor de Hive.

Es decir, su proceso de Java se ubicará en un bucle, haciendo eco de la salida, mientras el servidor de Hive se esté ejecutando.

¿Es esto lo que quieres que haga? Si es así, entonces obviamente no será capaz salir. Si no, entonces no hay ninguna razón para que lea el flujo de entrada del servidor, y su programa Java puede salir después de que haya iniciado el proceso del servidor. Alternativamente, si desea escuchar la salida y hacer otras cosas en su proceso de Java, tendrá que usar varios hilos para hacer dos cosas a la vez.

contestado el 03 de mayo de 12 a las 11:05

Por lo que puedo ver, está iniciando un servidor, es decir, una aplicación que se inicia y no finaliza pronto. Sigue funcionando. Esto significa que el STDOUT de esta aplicación (el servidor) no está cerrado (a menos que esté eliminando el servidor).

Método shellIn.read() está bloqueando Lee el siguiente byte del flujo de entrada y regresa cuando se lee el byte o cuando se cierra el flujo.

Entonces, en su caso, la transmisión nunca se cierra, por lo tanto, su programa se atascó: está esperando para siempre la entrada (y probablemente la esté leyendo).

Para resolver este problema, necesita un hilo separado: ya sea en Java o en el sistema operativo. Puede ejecutar su servidor desde un subproceso java separado o componer una línea de comando para ejecutar el servidor en segundo plano (por ejemplo, usando el seguimiento &).

contestado el 03 de mayo de 12 a las 11:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.