# In der JVM einen weiteren, unabhängigen Prozess starten



## tuxedo (18. Mrz 2009)

Hallo,

Ich hab eine Java-Anwendung die eine zweite Java-Anwendung starten soll. Das klappt mit Runtime.exec() und dem ProcessBuilder ja soweit prima.

Nur bleibt der Prozess meiner ersten Anwendung solange am leben, wie der zweite Prozess noch läuft.

Beispiel:

Ich habe Java Anwendung A. Diese startet dann Java Anwendung B. B soll weiter laufen, auch wenn A schon beendet wurde. 

Und genau da ist der Haken: Anwendung A lässt sich soweit eigentlich beenden, aber der Prozess der JVM der Anwendung A bleibt noch solange am Leben wie der Prozess der Anwendung B lebt.

Lässt sich das irgendwie entkoppeln/durchbrechen so dass ich im Endeffekt zwei vollkommen voneinander unabhängige Prozesse hab?

Hab gegoogelt und im Forum gesucht. Aber bei der Flut an Ergebnissen, die sich alle mit dem grundlegenden Problem "wie starte ich überhaupt eine weitere Anwendung" beschäftigen, hab ich keine für mich passende Antwort gefunden.

Gruß
Alex


----------



## Wildcard (18. Mrz 2009)

Betriebssystemabhängig. Auf einem Linux System zB mit nohup


----------



## Spacerat (18. Mrz 2009)

Rein theoretisch... Läuft ein Dämon-Thread nicht weiter, wenn die Hauptanwendung schon beendet wurde... Was ist denn, wenn man "Runtime.exec()" innerhalb eines solchen Threads ausgeführt wird?


----------



## Wildcard (18. Mrz 2009)

Spacerat hat gesagt.:


> Rein theoretisch... Läuft ein Dämon-Thread nicht weiter, wenn die Hauptanwendung schon beendet wurde... Was ist denn, wenn man "Runtime.exec()" innerhalb eines solchen Threads ausgeführt wird?



Sollte ein SIGTERM an den Prozess schicken.


----------



## tuxedo (19. Mrz 2009)

nohup unter Linux kenne ich. Hatte aber wohl vergessen zu erwähnen dass ich eine Lösung für Windows brauche falls Java da nix von Haus aus mitbringt.

Hab schon diverse Kombinationen aus "cmd /C" und "start" ausprobiert, hat aber alles nix geholfen. Auch eine "Funktion" aus einer der Windows-DLLs wäre hilfreich, dann binde ich das mittels JNA ein. 

- Alex


----------



## ice-breaker (19. Mrz 2009)

für Windows würde mich das auch interessieren


----------



## ice-breaker (19. Mrz 2009)

In dem gnuwin32 CoreUtils package soll wohl nen windows nohup sein, kannst ja mal schauen ob das funzt.


----------



## Spacerat (20. Mrz 2009)

Experiment: Hab' zwar gehört, das ThreadGroups nicht besonders kluk sind, aber mit diesem Code hab' ich schon mal was hinbekommen. Im Taskmanager kann man das Ergebnis nachvollziehen. Getestet habe ich das mit "notepad.exe" und "cmd.exe". Lustigerweise macht "cmd.exe" nicht das was es soll, nämlich eine Konsole öffnen. Liegt aber glaub' ich nicht an Java.

```
public final class ProcessIndependence
{
  public static void main(String[] args)
  {
    if(args.length == 0) args = new String[] {"notepad.exe"};
    new ProcessDaemon(args[0]).start();
  }

  private static final class ProcessDaemon
  extends Thread
  {
    private ProcessDaemon(String command)
    {
      super(new ThreadGroup("IndependentProcess"),  command);
      getThreadGroup().setDaemon(true);
    }

    public void run()
    {
      try {
        Process p = Runtime.getRuntime().exec(getName());
        while(!isInterrupted()) {
          try {
            p.exitValue();
            interrupt();
          } catch(IllegalThreadStateException e) {
            Thread.sleep(1000L);
          }
        }
      } catch(Throwable e) {
        interrupt();
      }
    }
  }
}
```
Edit: ICH BIN SO KLUK, ICH BIN SO KLUK... K.L.U.K... ich mein k.l.u.geheee (Homer Simpson)


----------



## tuxedo (20. Mrz 2009)

Naja, entweder du hast eine JVM die sich anders verhält, oder du bist wirklich nur K.L.U.K. und nicht klug 

Dein Sample startet zwar Notepad, aber der Java-Prozess terminiert nicht ohne dass ich Notepad beende.

Habs per copy&paste in Eclipse gezogen und von da gestartet. Ist java 6 Update 11 drauf.

Gruß
Alex


----------



## Illuvatar (20. Mrz 2009)

tuxedo hat gesagt.:


> Hab schon diverse Kombinationen aus "cmd /C" und "start" ausprobiert, hat aber alles nix geholfen. Auch eine "Funktion" aus einer der Windows-DLLs wäre hilfreich, dann binde ich das mittels JNA ein.
> 
> - Alex



[HIGHLIGHT="Java"]public class Test
{
  public static void main(String... args) throws Throwable
  {
    Runtime.getRuntime().exec("cmd /c START notepad.exe");
  }
}[/HIGHLIGHT]

Startet bei mir Notepad und terminiert.
Java 1.6.0_11 (64bit)
Nicht aus Eclipse heraus gestartet, was aber ja wohl keinen Unterschied machen sollte.


----------



## tuxedo (20. Mrz 2009)

Huuh? Was mach ich denn "falsch" ? Genau dieses Sample terminiert bei mir nicht solange das Notepad offen ist...

- Alex

[update]
Muss an Eclipse liegen. Außerhalb Eclipse funktionierts ...*seltsam*


----------



## Spacerat (20. Mrz 2009)

@tuxedo: Hat mich anfangs auch verwirrt. Möglicherweise übersiehst du, das in Eclipse bei Ausführung dieser Zeilen zwei Prozesse angezeigt werden, von denen sich einer sofort, und der andere erst nach der Beendigung von z.B. Notepad beendet. Starte das mal in der Konsole und öffne mal den TM. Während die Konsole bereits wieder für eingaben zur Verfügung steht sieht man im TM aber noch mindestens einmal "javaws.exe" und eben mindestens einmal "notepad.exe". wird Notepad beendet, verschwinden auch diese beiden Prozesse.
edit: ok... bist wohl schon selbst drauf gekommen
edit2: @Illuvator: Irgendwer hat hier behauptet, das würde nicht gehen... Dein Beispiel mein ich... Hab's deswegen nicht nachvollzogen... Ist doch aber die Kurzform von meinem? naja... mal gewinnt man, und mal verlieren andere... oder so...).
edit3: ... also doch K.L.U.K (wofür auch immer diese Abkürzung steht... stand anfänglich auch nur wegen so nem Schreibfehler da  ). Wenn man's genau nimmt sagt das zurückgegebene Objekt (Process) ja schon einiges über das Verhalten von eben jenem aus. Der Umweg über einen Extra-Daemon-Thread (in einer ThreadGroup) ist deswegen schon mehr als flüssig...


----------

