2 votes

Java : Exécution d'un script shell en arrière-plan

Je essaie de lancer un script shell en arrière-plan qui ne se termine pas lorsque ma fonction/processus se termine. Cependant, il semble que malgré nohup, lorsque le thread Java se termine. Le script se termine aussi.

Voici un exemple de code.

///
/// Essaie d'exécuter un script en arrière-plan
///
try {
    Runtime rt = Runtime.getRuntime();
    Process pr = rt.exec("nohup sh ./runner.sh > output.txt &", new String[] {}, wrkDir);
    // pr.waitFor(); // Intentionnellement non utilisé
} catch(Exception e) {
    throw new RuntimeException(e);
}

1voto

Palpatim Points 7344

nohup s'applique aux appels depuis le shell, pas depuis un programme appelant.

Il y a probablement beaucoup de façons de résoudre ceci, mais l'une qui me vient à l'esprit est de modifier votre code Java pour invoquer un script shell de lancement qui invoque le code nohup runner.sh... (sans avoir besoin de lancer sh).

Quelque chose comme ce code (non testé) :

Java Révisé:

///
/// Tente d'exécuter un script en arrière-plan
///
try {
    Runtime rt = Runtime.getRuntime();
    Process pr = rt.exec("sh ./launcher.sh", new String[] {}, wrkDir);
    // pr.waitFor(); // Intentionnellement non utilisé
} catch(Exception e) {
    throw new RuntimeException(e);
}

launcher.sh

#!/bin/sh

nohup ./runner.sh > output.txt &

Je ne suis pas sûr de la redirection ici, mais si cela fonctionne (comme je l'ai mentionné, cette solution n'est pas testée), l'inconvénient serait que vous perdez les retours d'informations provenant de la tentative d'invoquer runner - toute erreur dans cette invocation de script ne sera pas disponible pour votre processus Java.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X