2016-12-22 3 views
2

Ich versuche, ein Shell-Skript im Hintergrund auszuführen, das nicht endet, wenn meine Funktion/Prozess endet. Es scheint jedoch, dass trotz Nohup, wenn der Java-Thread endet. So auch das Skript.Java: Laufendes Shell-Skript im Hintergrund

Unten ist Beispielcode.

/// 
/// Tries to run a script in the background 
/// 
try { 
    Runtime rt = Runtime.getRuntime(); 
    Process pr = rt.exec("nohup sh ./runner.sh > output.txt &", new String[] {}, wrkDir); 
    // pr.waitFor(); // Intentionally not using 
} catch(Exception e) { 
    throw new RuntimeException(e); 
} 

Antwort

1

nohup gilt für Anrufungen aus der Schale, nicht von einem rufenden Programm. Es gibt wahrscheinlich viele Möglichkeiten, dies zu lösen, aber eine, die Ihnen in den Sinn kommt, besteht darin, Ihren Java-Code zu modifizieren, um ein Launcher-Shell-Skript aufzurufen, das den Code nohup runner.sh... aufruft (ohne dass sh gestartet werden muss).

So etwas wie dieses (ungetestet) Code:

Überarbeitete Java:

/// 
/// Tries to run a script in the background 
/// 
try { 
    Runtime rt = Runtime.getRuntime(); 
    Process pr = rt.exec("sh ./launcher.sh", new String[] {}, wrkDir); 
    // pr.waitFor(); // Intentionally not using 
} catch(Exception e) { 
    throw new RuntimeException(e); 
} 

launcher.sh

#!/bin/sh 

nohup ./runner.sh > output.txt & 

ich über die Umleitung hier nicht sicher bin, Aber wenn das funktioniert (wie ich bereits erwähnte, ist diese Lösung nicht getestet), wäre der Nachteil, dass Sie Futter verlieren Zurück vom Versuch, runner aufzurufen - viele Fehler in diesem Skriptaufruf sind für Ihren Java-Prozess nicht verfügbar.

Verwandte Themen