Runtime.exec beendet Programm unter Linux, wenn Java Programm beendet wird

Grizzly

Top Contributor
Hallo alle zusammen,

langer Titel und fast schon die halbe Problembeschreibung. Leider habe ich nichts kürzeres gefunden. Und ich wollte auch nicht "Runtime.exec()" o.ä. als Titel verwenden. ;-)

Also: Ich habe ein Java Programm, welches unter Linux ein Skript oder Programm starten und sich dann selber beenden soll. Leider beendet das Beenden des Java Programms auch immer das Programm, welche über es selber gestartet wurde.

Ich habe ein kurzes Beispiel-Skript verfasst, welches sowohl in eine Datei, wie auch in die Konsole die aktuelle Uhrzeit schreibt:
Code:
#!/bin/sh
rm -f clock.log
while [ -n "0" ]; do
    d=$(date +"%H:%M:%S")
    echo $d >> clock.log
    echo $d
    sleep 1
done

Dann habe ich noch ein kleines Java Programm verbrochen:

Java:
public class Test
  {
  public static void main(String[] args) throws IOException, InterruptedException
    {
    System.out.println("Start clock...");
    process = Runtime.getRuntime().exec(
        "/bin/bash /home/webfox/clock");
    System.out.println("Terminate Java program.");
    }
  }

Ausgeführt habe ich die Sache unter Ubuntu 10.04.3. Die Problematik hängt wohl damit zusammen, dass mit dem Java Programm der Parent Process wegfällt, was dazu führt, dass der Child Process auch gekillt wird. Wenn ich es direkt in der Shell probiere, kann ich die Clock bspw. in den Hintergrund setzen, die Verbindung lösen und die Shell beenden. Dann wird der Init Process zum Parent Process für das Skript. Aber das funktioniert über Runtime.exec() halt leider nicht.

Hat irgend jemand eine Idee, wie man das lösen könnte? ???:L
 
versuch es mal mit dem ProcessBuilder ...

weis jetzt nicht genau ob es einen unterschied macht ... aber in der regel sollte sowas nicht passieren ...

Java:
public class Test {
    public static void main(String[] args) {
        ProcessBuilder pb;

        try {
            System.out.println("Start clock...");
            pb = new ProcessBuilder("/home/webfox/clock");
            pb.start();
            System.out.println("Terminate Java program.");
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

Nein, funktioniert leider auch nicht. Das Problem ist, dass ich auch von der Linux Seite schon einige Sachen probiert habe (disown, hangup, &, usw.). Hat auch alles nicht funktioniert. :-(
 
Okay, Problem gefunden: Die Streams sind schuld. Sprich man muss stdin, stdout und stderr des Programms versorgen bzw. umleiten. Ansonsten stirbt es. Könnte bspw. folgendermaßen aussehen:

Code:
#!/bin/sh
/home/user/clock 0>/dev/null 1>/dev/null 2>/dev/null &
Dieses Skript würde jetzt bspw. das oben genannte Skript aufrufen und die Streams entsprechend verbinden.

Man könnte natürlich noch stdout und stderr in eine Log-Datei umleiten. 🙂
 

Zurück
Oben