Comment surveiller les processus dirigé par ProcessBuilder?
Cela devrait être plutôt simple, mais je ne vois pas quelque chose d'utile dans La documentation javadoc.
Ce que j'ai besoin est d'exécuter certains processus externe à partir de mon code Java et être en mesure de surveiller si ce processus a été l'arrêt ou pas. En d'autres termes, je veux être en mesure de déterminer de manière fiable si oui ou non mon processus externe n'a pas été terminé par l'utilisateur.
Si pas de croix-plate-forme de la solution existe, je vais accepter que rien ne fonctionne sous Linux.
Mon bout de code:
public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder("some proces name");
try {
Process p = pb.start();
//p.isRunning(); <- now, that would be helpful :-)
} catch (IOException e) {
e.printStackTrace();
}
}
Tu veux dire quoi par "arrêt" ou "pas terminé par l'utilisateur". Parlez-vous un code d'erreur ou une autre sortie?
Bien, en disant "s'est terminée par l'utilisateur" pourrait en effet ne pas être exactes. Ce que je veux vraiment savoir c'est si le processus est toujours en cours d'exécution à un moment donné.
Bien, en disant "s'est terminée par l'utilisateur" pourrait en effet ne pas être exactes. Ce que je veux vraiment savoir c'est si le processus est toujours en cours d'exécution à un moment donné.
OriginalL'auteur | 2012-07-16
Vous devez vous connecter pour publier un commentaire.
Démarrer un nouveau Thread qui appelle
Process.waitFor()
et définit un indicateur lorsque cet appel retourne. ensuite, vous pouvez vérifier que le drapeau à chaque fois que vous voulez voir si le processus est terminé.(réutilisable omis).
OriginalL'auteur jtahlborn
Je ne suis pas sûr que je suis à la compréhension de la question, mais une façon de le faire est d'appeler
process.exitValue();
. Elle lève une exception si le processus n'est pas encore terminée:Si vous n'avez pas l'esprit un hack, vous pouvez faire quelque chose comme ce qui suit si vous travaillez sur un ~système Unix qui utilise le
UNIXProcess
classe. Ce n'utiliser la réflexion cependant:Process
instance et pourrait fournir des métadonnées supplémentaires concernant l'état du thread en cours d'exécution dans le processus.Je considère pas cela comme de l'API "abus". Tout c'est la non-condition booléenne. J'ai aussi ajouté un moyen d'obtenir de l'
hasExited
interne de la valeur, mais c'est un hack qui utilise la réflexion.Je vais aller avec
waitFor()
, mais +1 pour la réflexion idée.OriginalL'auteur Gray
Basé sur la question spécifique de l'extrait de code que je pourrais être utile d'ajouter que, depuis 1.8
Process
classe a unisAlive()
méthode est disponibleDocumentation lien: https://docs.oracle.com/javase/8/docs/api/java/lang/Process.html
bonne chance à toute personne la lecture de ce!
OriginalL'auteur Harrison Telfer