Hello,
sous linux, la commande top ne prend pas de paramètre | ni grep ni -w ni 'Cpu(s)' ni 'Mem'
Devant tous ces paramètre inconnus, la commande ne s'exécute donc pas. À la place elle écrit un message d'erreur sur la sortie d'erreur, que tu ne lis pas. Tu ne peux donc pas voir ce qui se passe mal.
Le symbole | de redirection de flux, est un opérateur de shell, or exec() n'est pas un shell. On lui donne un nom de programme et ses paramètres, et il demande au système d'exploitation d'exécuter ce programme et ces paramètres. Le système d'exploitation n'est pas un shell non plus, top n'est pas un shell non plus, et donc rien de tout ça ne sait quoi faire de ton | bizarre ou de ce qu'il y a après.
Pour pouvoir utiliser ce symbole, il faut demander à un shell d'exécuter cette commande. Ça ressemblerait à ça :
proc2 = Runtime.getRuntime().exec("sh -c 'top -n1 | grep -w \"Cpu(s)\"'");
Comme c'est un peu compliqué, on va découper cette chaîne unique "la commande à lancer" en un tableau de chaînes "la commande suivie de ses paramètres". Ça donne ça :
proc2 = new ProcessBuilder("sh", "-c", "top -n1 | grep -w 'Cpu(s)'").start();
Reste à faire en sorte d'avoir une visibilité sur les erreurs quand quelque chose se passe mal. On va faire en sorte que la sortie d'erreur de sh et donc de top, soit redirigée vers la sortie d'erreur du programme Java (et donc s'affiche dans la console.)
1 2 3
| proc2 = new ProcessBuilder("sh", "-c", "top -n1 | grep -w 'Cpu(s)'")
.redirectError(Redirect.INHERIT)
.start(); |
Et ajouter un message d'erreur si le code de retour de sh donc de top, n'est pas "0 tout s'est bien passé" :
1 2 3 4
| // après avoir fini de lire l'InputStream correspondant :
if(proc2.waitFor() != 0) {
System.err.println("proc2 terminated with error exit code: " + proc2.exitValue());
} |
Partager