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

Java Discussion :

PID de l'application Java courante


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 236
    Par défaut PID de l'application Java courante
    Bonjour
    Mon problème est de récupérer le PID de mon application java à son exécution. J'ai donc entrepris quelques recherches, qui m'ont permis d'aboutir à ce code pour la résolution de mon problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public static String getPPids() throws IOException, InterruptedException {
            Vector<String> commands = new Vector<String>();
            commands.add("/bin/bash"); commands.add("-c"); commands.add("echo $$");
            ProcessBuilder pb = new ProcessBuilder(commands);
            Process pr = pb.start();
            pr.waitFor();
            if (pr.exitValue() == 0) {
                    BufferedReader outReader = new BufferedReader(new InputStreamReader(pr.getInputStream()));
                    return outReader.readLine().trim();
    	} 
            else {
                    System.out.println("Erreur");
                    return "";
            }
    }
    cependant, le PID qui m'est retourner, semble ne pas correspondre à celui de mon application. En effet, quand j'exécute dans mon terminal
    kill -9 pid_retouner
    mon application ne se ferme pas et j'ai un message m'indiquant qu'aucun processus ne correspont à ce PID. Je rappel que je tourne sous linux.
    Pourriez vous s'il vous plait me donner quelques indications afin de réellement déterminer le PID de l'application courante.
    Merci

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Tu ne peux pas utiliser la commande java "System.exit(codeDeRetour)" ?
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Invité
    Invité(e)
    Par défaut
    Si tu fais ça tu as le PID du processus qui exécute ta commande pas de la jvm. Tente plutôt ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    commands.add("echo $PPID");

  4. #4
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Comme le signale George7, $$ retourne le PID du process courant... donc de /bin/bash !!!
    Il te faut le process parent, donc $PPID !


    De plus j'aurait quelques remarques :
    • Perso à la place de /bin/bash j'appelerais plutôt /bin/sh. Ce dernier est normalement toujours présent sur les systèmes Unix/Linux, ce qui n'est pas forcément le cas de bash..
    • Pourquoi utiliser Vector ? En règle général on lui préfère ArrayList...
    • Mais surtout pourquoi ne pas utiliser le constructeur avec paramètres variables, c'est plus lisible !
    • De manière générale tu dois traiter les flux en parallèle avant le waitFor(), sinon tu risques des dead-lock.
    • Tu ne fermes pas ton flux de lecture
    • Tu ne traites pas les autres flux...
    • Ta gestion des erreurs est... un peu spéciale (il serait préférable de remonter une exception)



    Bref pour moi ta méthode devrait plutôt ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    	public static String getPPid() throws IOException {
    		// On utilise les varargs pour initialiser la commande :
    		ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", "echo $PPID");
    		// On redirige le flux d'erreur vers le flux d'entrée
    		// (pour ne pas avoir à le traiter)
    		builder.redirectError();
    		// On lance le process :
    		Process process = builder.start();
    		try {
    			// On ferme le flux d'entrée (on n'en a pas besoin)
    			process.getOutputStream().close();
    			// (si on le l'avait pas redirigé on pourrait faire la même chose du flux d'erreur)
    			String line = null;
    			// On lit une ligne :
    			BufferedReader outReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    			try {
    				line = outReader.readLine();
    			} finally {
    				outReader.close();
    			}
    			if (line==null) {
    				throw new IOException("Unable to get PID");
    			}
    			return line.trim();
    		} finally {
    			// Au cas ou ca part en vrille, on détruit le process
    			process.destroy();
    		}
    	}





    Maintenant si tu as besoin de plusieurs fonctionnalités systèmes, il serait préférable de passer par du code natif via JNI ou plus simplement JNA :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class Unix {
    	static {
    		// On associe les méthodes natives
    		// à une librairie native chargé par JNA :
    		com.sun.jna.Native.register("c");
    	}
     
    	public static native int getpid();
     
    	public static native int getppid();
     
    	public static native int kill(int process, int signal);
     
    	// ...
    }

    a++

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 236
    Par défaut
    Bonjour à tous
    Merci pour vos réponses, ça m'a été d'un grande aide. J'ai donc mis mon code à jour, mais le problème persiste encore, parce que le PID que j'obtiens n'est pas celui de l'application courante. Cependant j'ai pu constater que le PID du processus de l'application courante est en réalité la valeur de retour getPPid() (converti en entier) moins un. C'est à dire que si par exemple la valeur de retour de getPPid() est 9141, alors le PID de mon application est 9140. J'avoue que que je ne comprend rien à ce calcul. C'est vrai que ça me permet d'avoir le PID réel, mais je cherche vraiment à comprendre. Si vous pouvez m'éclairer, je reste à l'écoute.
    Merci d'avance

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/05/2007, 18h10
  2. Sécuriser une application java (stand alone)
    Par debutant java dans le forum Sécurité
    Réponses: 4
    Dernier message: 05/04/2005, 13h28
  3. [Son] Faire des bruits avec une application java
    Par mammistegon dans le forum Multimédia
    Réponses: 6
    Dernier message: 22/01/2005, 17h17
  4. Réponses: 2
    Dernier message: 26/05/2003, 19h42
  5. Serveur d'applications Java
    Par foxrol dans le forum Java EE
    Réponses: 3
    Dernier message: 17/05/2003, 00h49

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