Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

URGENT : Runtime.exec() vs windoz : execution do not stops

3 réponses
Avatar
Raphaël Piéroni
String generationBatch = "cmd /C generation.bat";

File dir = new File("target/generation/WEB-INF/");
System.out.println(dir.getAbsolutePath());
System.out.println(generationBatch +" -m 100");

Process process = Runtime.getRuntime().exec(generationBatch +
" -m 100", null, dir);

BufferedReader input = new BufferedReader(
new InputStreamReader(process.getInputStream()));
BufferedReader error = new BufferedReader(
new InputStreamReader(process.getErrorStream()));

process.waitFor();


---------------------------------------
le fichier batch lance une execution de java qui se fait, jusqu'au
System.exit(1);

mon fichier batch se termine même par "exit"

---------------------------------------

quelqu'un peut il me dire pourquoi l'execution ne s'arrete pas ???

3 réponses

Avatar
Frederic Lachasse
"Raphaël Piéroni" wrote in message
news:bfoftf$274p$
String generationBatch = "cmd /C generation.bat";

File dir = new File("target/generation/WEB-INF/");
System.out.println(dir.getAbsolutePath());
System.out.println(generationBatch +" -m 100");

Process process = Runtime.getRuntime().exec(generationBatch +
" -m 100", null, dir);

BufferedReader input = new BufferedReader(
new InputStreamReader(process.getInputStream()));
BufferedReader error = new BufferedReader(
new InputStreamReader(process.getErrorStream()));

process.waitFor();


---------------------------------------
le fichier batch lance une execution de java qui se fait, jusqu'au
System.exit(1);

mon fichier batch se termine même par "exit"

---------------------------------------

quelqu'un peut il me dire pourquoi l'execution ne s'arrete pas ???


La commande "cmd /C generation.bat -m 100" doit probablement écrire des
information dans stdout ou stderr. La JVM redirige stdout et stderr vers des
pipes pour qu'ils soient accessibles avec Process.getOutputStream() et
Process.getErrorStream(). Ces pipes ont une taille fixe, et quand le process
écrit dans un pipe plein, l'OS bloque le process et attend que l'autre bout
du pipe (ton programme Java) lise le pipe pour faire de la place.

Or tu ne lis pas ce qu'il y a dans le pipe. D'un côté, le programme java
attend la fin du process, de l'autre, le process attend que le programme
java lise les BufferedReader input et error. Conclusion: deadlock.

--
Frédéric Lachasse -

Avatar
Frederic Lachasse
"Raphaël Piéroni" wrote in message
news:bfqp4n$sct$
Même avec ce code là ca ne fonctionne pas. ca reste bloqué

BufferedReader input = new BufferedReader(
new InputStreamReader(process.getInputStream()));
BufferedReader error = new BufferedReader(
new InputStreamReader(process.getErrorStream()));

String lineEr;
String lineOu;
String resultEr = "";
String resultOu = "";
lineEr = error.readLine();
lineOu = input.readLine();
while (lineEr != null || lineOu != null) {
if (lineEr != null)
resultEr = resultEr + lineEr;
if (lineOu != null)
resultOu = resultOu + lineOu;
lineEr = error.readLine();
lineOu = input.readLine();
}
System.out.println("RESULTOUT="+resultOu);
System.out.println("RESULTERR="+resultEr);

process.waitFor();
input.close();
error.close();


error.readLine() va attendre jusqu'à ce qu'une ligne soit écrite par le
programme sur stderr, ou bien jusqu'à ce que le programme se termine, ce qui
est considéré par readLine() comme une fin de fichier. Comme beaucoup de
programmes n'écrivent pas sur stderr, et c'est probablement le cas pour ton
"generation.bat", tu vas bloquer sur le premier error.readLine().

Solution: 1) Tu connais précisément ce que le programme que tu lances fait,
et en particulier n'écrit pas ou très peu (1 à 2 lignes) sur stderr, et tu
peux ignorer le process.getErrorStream(), considérant que le pipe sera
suffisemment grand pour ne pas bloquer l'exécution du programme. 2) Tu n'as
pas le choix, tu dois lire les 2 stdout et stderr. Dans ce cas, les lectures
doivent être faites dans des threads séparés.

Astuce: dans ton cas, tu lances en fait cmd.exe, et cmd.exe accepte le
paramètre "2>&1" qui lui dit de rediriger stderr vers stdout, fusionant les
deux dans stdout. C'est une fonction de cmd.exe, pas de Runtime.exec().

Process process = Runtime.getRuntime().exec(generationBatch +
" -m 100 2>&1", null, dir);



Frederic Lachasse wrote:
"Raphaël Piéroni" wrote in message
news:bfoftf$274p$

String generationBatch = "cmd /C generation.bat";

File dir = new File("target/generation/WEB-INF/");
System.out.println(dir.getAbsolutePath());
System.out.println(generationBatch +" -m 100");

Process process = Runtime.getRuntime().exec(generationBatch +
" -m 100", null, dir);

BufferedReader input = new BufferedReader(
new InputStreamReader(process.getInputStream()));
BufferedReader error = new BufferedReader(
new InputStreamReader(process.getErrorStream()));

process.waitFor();


---------------------------------------
le fichier batch lance une execution de java qui se fait, jusqu'au
System.exit(1);

mon fichier batch se termine même par "exit"

---------------------------------------

quelqu'un peut il me dire pourquoi l'execution ne s'arrete pas ???



La commande "cmd /C generation.bat -m 100" doit probablement écrire des
information dans stdout ou stderr. La JVM redirige stdout et stderr vers
des


pipes pour qu'ils soient accessibles avec Process.getOutputStream() et
Process.getErrorStream(). Ces pipes ont une taille fixe, et quand le
process


écrit dans un pipe plein, l'OS bloque le process et attend que l'autre
bout


du pipe (ton programme Java) lise le pipe pour faire de la place.

Or tu ne lis pas ce qu'il y a dans le pipe. D'un côté, le programme java
attend la fin du process, de l'autre, le process attend que le programme
java lise les BufferedReader input et error. Conclusion: deadlock.







Avatar
Raphaël Piéroni
Merci pour tout.

Le problème était bien la taille des pipes.
Mais la redirection des pipes vers d'autre ne fonctionnait pas
correctement.
ma commande est donc maitenant
.exec("cmd /C generation.bat " + option + " 1>out.txt 2>err.txt", null,
dir)

R