Je crée une application et l'une des exigences pour le moment est de pouvoir rechercher des processus d'autres applications en cours d'exécution et de les tuer si nécessaire.

J'ai essayé " jps " qui est livré avec le JDK et c'est exactement ce dont j'ai besoin. L'ID de processus de l'application et le vrai nom de l'application. En utilisant cela, je peux tuer par identifiant de processus, ainsi que faire correspondre par nom les processus dont j'ai réellement besoin pour terminer, sans terminer les mauvais processus. Malheureusement, tous les utilisateurs finaux de cette application n'auront pas le JDK, donc jps n'est pas fiable. J'ai besoin d'une autre façon de faire cela.

J'ai essayé de nombreuses commandes "ps" qui ne semblent pas fonctionner correctement. Par exemple au moment où j'utilise

ps -e -o command

Ce qui me donne ...

line:  2729 ?        00:02:53 chrome
line:  2824 ?        00:00:00 cat
line:  2825 ?        00:00:00 cat
line:  2945 ?        00:00:00 chrome
line:  2946 ?        00:00:00 nacl_helper
line:  2959 ?        00:00:00 chrome
line:  2962 ?        00:00:00 gconfd-2
line:  3120 ?        00:07:39 chrome
line:  3179 ?        00:00:00 chrome
line:  3296 ?        00:00:44 chrome
line:  3500 ?        00:00:00 bash
line:  3751 ?        00:07:27 java
line:  3832 ?        00:00:00 file-roller
line:  4832 ?        00:00:23 chrome
line:  4883 ?        00:00:03 gnome-terminal-
line:  6085 ?        00:00:51 chrome
line:  6380 ?        00:00:06 chrome
line:  7865 ?        00:00:16 chrome
line:  8961 ?        00:00:06 chrome
line:  9404 ?        00:00:43 chrome
line: 10344 ?        00:00:02 chrome
line: 10761 ?        00:00:05 chrome
line: 11158 ?        00:00:00 java
line: 11193 ?        00:00:00 sh

Cela ne m'aide pas car il n'affiche pas les noms de processus, et il ne semble pas non plus exact. Lorsque j'exécute mes applications Java à partir du terminal, puis que je relance le programme, les applications en cours d'exécution ne changent pas alors que je devrais m'attendre à voir un processus supplémentaire ajouté.

De Java que j'utilise actuellement

/bin/sh -c ps -e -o command

Y a-t-il un moyen de faire ça? Ou un moyen d'isoler l'exécutable jps afin que je puisse le mettre dans mon projet et l'utiliser dans un manoir portable?


Lorsque j'exécute jps à partir du JDK, j'obtiens ce résultat

3751 Main
14015 Jps
**11503** updater.jar

Lorsque j'exécute ps -ef depuis mon terminal machine, j'obtiens cette sortie

root     10519     2  0 20:25 ?        00:00:00 [kworker/5:0]
root     11156     2  0 20:40 ?        00:00:00 [kworker/7:1]
root   **11503**  6170  0 20:49 pts/1    00:00:01 java -jar game/updater.jar /home
root   13031  2959  0 21:15 ?        00:00:13 /opt/google/chrome/chrome --type
root     13071     2  0 21:19 ?        00:00:00 [kworker/4:2]

Lorsque j'exécute ps -ef à partir de mon application Java, j'obtiens ce qui suit et l'ID de processus 11503 est introuvable ...

Process process = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", "ps", "-ef" });

line:  7865 ?        00:00:17 chrome
line:  8961 ?        00:00:06 chrome
line:  9404 ?        00:00:43 chrome
line: 10344 ?        00:00:03 chrome
line: 13031 ?        00:00:09 chrome
line: 13098 ?        00:00:15 chrome
line: 13961 ?        00:00:00 java
line: 13996 ?        00:00:00 sh
line: 13997 ?        00:00:00 ps

Le problème était le / bin / sh -c dans la commande. La suppression de cela m'a donné la sortie correcte même si je pense toujours que jps est une meilleure solution (le jps peut être isolé mais la taille finale est d'environ 100 Mo)

0
kbz 20 août 2017 à 21:43

2 réponses

Meilleure réponse

Bien que les réponses publiées à cette question semblent aborder un problème, elles n'ont finalement pas résolu mon problème.

Le problème était la commande que je passais

Process process = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", "ps", "-ef" });

Le / bin / sh -c doit être supprimé et il renvoie les processus corrects.

Process process = Runtime.getRuntime().exec(new String[] { "ps", "-ef" });

J'ai également décidé d'utiliser l'application jcmd fournie par le JDK, car elle fournit exactement ce que je recherche et est prise en charge sur toutes les plates-formes.

0
kbz 3 sept. 2017 à 11:04

Comme cela semble être Linux, ou similaire, j'aurais pensé qu'une approche plus agréable que de capturer la sortie de "ps" serait d'énumérer tous les fichiers dans / proc avec des noms de fichiers numériques, et d'examiner le fichier cmdline dans chacun. Autrement dit, tous les différents fichiers / proc / NNNN / cmdline. Cela ne nécessite pas l'exécution de ps ou de tout autre processus externe dont la sortie peut être légèrement différente d'un système à l'autre. Il donne accès à toutes les informations dont dispose le système d'exploitation - vous n'avez pas à vous fier à "ps" pour faire exactement ce que vous voulez.

De plus, vous n'avez pas à vous fier à Runtime.exec () et à tous ses subtils méchants.

0
Kevin Boone 21 août 2017 à 12:52