Saltar al contenido

¿Cómo lanzo un proceso completamente independiente de un programa Java?

Solución:

Hay una relación padre-hijo entre sus procesos y tiene que romperla. Para Windows puedes probar:

Runtime.getRuntime().exec("cmd /c start editor.exe");

Para Linux, el proceso parece ejecutarse separado de todos modos, no es necesario no hacer nada. Lo probé con gvim, midori y acroread.

import java.io.IOException;
public class Exec {
    public static void main(String[] args) {
        try {
            Runtime.getRuntime().exec("/usr/bin/acroread");
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("Finished");
    }
}

Creo que no es posible hacerlo con Runtime.exec de forma independiente de la plataforma.

para sistema compatible con POSIX:

 Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", "your command"}).waitFor();

Aunque esta pregunta está cerrada, tengo algunas observaciones que pueden ayudar a otras personas que enfrentan problemas similares.

Cuando usa Runtime.getRuntime (). Exec () y luego ignora el identificador java.lang.Process que obtiene (como en el código del póster original), existe la posibilidad de que el proceso iniciado se bloquee.

Me enfrenté a este problema en el entorno de Windows y rastreé el problema hasta las transmisiones stdout y stderr. Si la aplicación iniciada está escribiendo en estos flujos y el búfer para estos flujos se llena, entonces la aplicación iniciada puede parecer que se bloquea cuando intenta escribir en los flujos. Las soluciones son:

  1. Capture el control del proceso y vacíe los flujos continuamente, pero si desea finalizar la aplicación Java inmediatamente después de iniciar el proceso, esta no es una solución factible.
  2. Ejecute la llamada al proceso como ‘cmd / c <>‘ (esto es solo para el entorno Windows).
  3. Agregue el comando de proceso como sufijo y redirija los flujos stdout y stderr a nul usando ‘comando> nulo 2> & 1

Puede ser útil publicar una sección de prueba con el código mínimo necesario para reproducir el problema. Probé el siguiente código en Windows y un sistema Linux.

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
        Runtime.getRuntime().exec(args[0]);
    }
}

Y probado con lo siguiente en Linux:

java -jar JustForTesting.jar /home/monceaux/Desktop/__TMP/test.sh

donde test.sh se ve así:

#!/bin/bash
ping -i 20 localhost

así como esto en Linux:

java -jar JustForTesting.jar gedit

Y probé esto en Windows:

java -jar JustForTesting.jar notepad.exe

Todos ellos lanzaron sus programas previstos, pero la aplicación Java no tuvo problemas para salir. Tengo las siguientes versiones de JVM de Sun según lo informado por java -version :

  • Windows: 1.6.0_13-b03
  • Linux: 1.6.0_10-b33

Todavía no he tenido la oportunidad de probar en mi Mac. Quizás haya alguna interacción ocurriendo con otro código en su proyecto que puede no estar clara. Es posible que desee probar esta aplicación de prueba y ver cuáles son los resultados.

¡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 *