Bonjour,
J'aimerais écrire un JSP qui m'affiche l'ID système du processus Java qui exécute ce JSP. Comment qu'on fait ? Mon serveur J2EE tourne sous Unisque donc pas de souci pour exécuter une commande système si nécessaire.
Bonjour,
J'aimerais écrire un JSP qui m'affiche l'ID système du processus Java qui exécute ce JSP. Comment qu'on fait ? Mon serveur J2EE tourne sous Unisque donc pas de souci pour exécuter une commande système si nécessaire.
ce n'est pas possible via une fonctione Java tu dois donc executer une commande Unix. regarde du côté de "ps"
Ca c'est pas une réponse. Je pars du principe que tout est possible, la question c'est de savoir à quel prix !Envoyé par jcarre
Et ben là le prix c'est Java 5.0 :
affiche
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; RuntimeMXBean mx = ManagementFactory.getRuntimeMXBean(); System.out.println(mx.getName());
PID@NOM_DE_MA_MACHINE
cqfd
J'imagine effectivement qu'il faut regarder du côté de la commande ps, mais je ne sais pas comment faire pour cîbler mon processus Java, ni même le processus qui lance la commande ps. J'ai tenter un truc du genre "/bin/ksh -c 'echo $$'" mais je ne récupère rien sur la sortie standard (idem si j'essaie avec "/bin/ksh -c 'echo toto'").
La solution est bien sympa, mais hélas c'est trop cher pour moi !!!! Je suis près à allonger Java 1.3 mais pas plus !!Envoyé par natha
T'en rate des chosesEnvoyé par _Mac_
Sinon tu trouves la solution native (JNI).
Pourquoi ne pas rediriger la sortie standard de la commande ps vers un fichier et ensuite lire le fichier ?
ps.... 2> nomdufichier
Pourquoi rediriger vers un fichier ? Lorsque tu lances une commande système tu récupères les flux stdout et stderr directement dans ton application Java (voir la classe Process).Envoyé par la7su
a++
En fait j'ai propose la solution de rediriger la sortie de ps vers un fichier plutot que de les recuperer dans l'appli java en pensant a un eventuel "filtre" applique directement sur le resultat de la cmd ps avec un pipe et dans ce cas je ne sais pas comment le tout reagi vu que je n'ai pas encore eu a faire ce genre de chose...Envoyé par adiGuba
Mais si tu as la reponse adiGuba...
c'est possible, mais je ne sais pas comment construire le filtre qui m'assure de trouver à coup sûr le PID : je peux avoir plusieurs processus Java qui tournent sur la machine avec des commandes quasi identiques, et je cherche justement à identifier les différences entre ces commandes.
Pour préciser mon besoin : je fais fonctionner mon appli sur plusieurs JVM qui sont load-balancées. Je cherche à récupérer le PID de la JVM qui répond à la requête pour faire des tests sur mon load balancing et la réplication de session HTTP.
Une idee peut etre pour identifier tes jvm serait d'essayer les differentes options de la cmd ps pour voir si tu ne trouves pas une difference sur les JVM (exemple -m qui liste les threads d'un process) ? Sinon voir avec qn qui maitrise unix pour te mettre sur la voie, c'est ma derniere cartouche dsl.
Le problème c'est que Runtime.exec() ne permet de lancer qu'une seule application, et non pas une commande complexe (avec pipe et redirection) comme dans un shell...Envoyé par la7su
A la rigeur tu peux peut-être appeller /bin/sh avec -c pour lui passer la commande à executer avec les pipes ca devrait marcher :
Sinon pour appeller un programme il y a plein d'exemple sur le forum... il faut juste bien penser à fermer les flux et à lire la sortie d'erreur et standard dans des threads séparé pour éviter les interblocages...
a++
Pour ceux que ça intéresse, j'ai résolu mon problème avec JNI. Je n'ai pas vu d'autre solution. Pour cela, j'ai créé une classe déclarant et chargeant une librairie JNI :
J'ai compilé la classe et généré les entêtes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public class JVMProcess { private static native int _getPPID(); public static int getPPID() { return _getPPID(); } static { System.loadLibrary("JVMProcess"); } }
J'ai écrit un fichier C tout bête qui affiche le PID du processus :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 javac JVMProcess.java javah -jni JVMProcess
J'ai enfin compilé la librairie et je l'ai installée (attention, je suis sous AIX) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #include <jni.h> #include "JVMProcess.h" JNIEXPORT jint JNICALL Java_JVMProcess__1getPPID(JNIEnv *env, jclass thisClass) { return (jint)getpid(); }
Ne reste plus qu'à appeler ma classe JVMProcess :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2cc -G -I"/usr/java131/include" -bE:JVMProcess.exp JVMProcess.c -o libJVMProcess.so cp libJVMProcess.so /usr/lib
Code : Sélectionner tout - Visualiser dans une fenêtre à part JVMProcess.getPPID();
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager