IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

[Système]Comment connaître l'ID de mon processus Java ?


Sujet :

API standards et tierces Java

  1. #1
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut [Système]Comment connaître l'ID de mon processus Java ?
    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.

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2002
    Messages : 125
    Points : 150
    Points
    150
    Par défaut
    ce n'est pas possible via une fonctione Java tu dois donc executer une commande Unix. regarde du côté de "ps"

  3. #3
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par jcarre
    ce n'est pas possible via une fonctione Java
    Ca c'est pas une réponse. Je pars du principe que tout est possible, la question c'est de savoir à quel prix !

    Et ben là le prix c'est Java 5.0 :

    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());
    affiche

    PID@NOM_DE_MA_MACHINE

    cqfd

  4. #4
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    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'").

  5. #5
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par natha
    Et ben là le prix c'est Java 5.0
    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 !!

  6. #6
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par _Mac_
    Je suis près à allonger Java 1.3 mais pas plus !!
    T'en rate des choses
    Sinon tu trouves la solution native (JNI).

  7. #7
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut
    Pourquoi ne pas rediriger la sortie standard de la commande ps vers un fichier et ensuite lire le fichier ?

    ps.... 2> nomdufichier

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par la7su
    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).

    a++

  9. #9
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par adiGuba
    Citation Envoyé par la7su
    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).

    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...
    Mais si tu as la reponse adiGuba...

  10. #10
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par la7su
    un eventuel "filtre" applique directement
    man sed (ou en français une autre page : sed)

  11. #11
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    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.

  12. #12
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut
    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.

  13. #13
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par la7su
    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...
    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...

    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++

  14. #14
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    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 :

    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 compilé la classe et généré les entêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    javac JVMProcess.java
    javah -jni 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
    3
    4
    5
    6
    #include <jni.h>
    #include "JVMProcess.h"
     
    JNIEXPORT jint JNICALL Java_JVMProcess__1getPPID(JNIEnv *env, jclass thisClass) {
    	return (jint)getpid();
    }
    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
    cc -G -I"/usr/java131/include" -bE:JVMProcess.exp JVMProcess.c -o libJVMProcess.so
    cp libJVMProcess.so /usr/lib
    Ne reste plus qu'à appeler ma classe JVMProcess :


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/05/2014, 09h52
  2. Réponses: 4
    Dernier message: 12/08/2013, 23h59
  3. Réponses: 3
    Dernier message: 30/09/2008, 11h51
  4. Réponses: 2
    Dernier message: 03/11/2006, 11h36
  5. Réponses: 3
    Dernier message: 28/06/2005, 10h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo