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

avec Java Discussion :

Commande DOS qui ne répond pas


Sujet :

avec Java

  1. #1
    Membre habitué Avatar de Jose.N70
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2009
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Points : 130
    Points
    130
    Par défaut Commande DOS qui ne répond pas
    Bonsoir, à toutes et à tous, j'ai un petit problème que je peux expliquer pourriez vous m'orienter ?

    Depuis mon application JAVA je souhaite lancer une commande DOS pour récupérer le PID d'un programme pour ce faire je lance la commande suivante :

    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
     
     
    ...
    String[] cmd = { "cmd.exe","/C", "wmic Process where Name=\"" +apps + "\" GET processid | more +1"};
    try {
    	Runtime r = Runtime.getRuntime(); 
    	Process p = r.exec(cmd); 
    	String s =null; 
    	BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream(), "IBM850")); 
    		try{
    			while ((s = reader.readLine()) != null) { 
    				System.out.println("PID : " +s);
    			}
    		}			
    ......
    La commande directement depuis "l'Invite de commandes" retourne bien le PID mais depuis mon application je reste bloquer sur while ... et plus rien ne se passe, aucune erreur ... simplement rien ...

    Si vous pouviez m'aider
    Merci à vous

  2. #2
    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
    Salut,



    Il faut TOUJOURS traiter tous les flux d'entrée/sorties, ou bien les fermer si on ne les utilise pas !!!

    Dans ta commande tu utilises "more" qui doit sûrement attendre une saisie clavier sur son Stdin. Comme tu n'envoie rien ca reste bloqué...


    a++

  3. #3
    Membre habitué Avatar de Jose.N70
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2009
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Points : 130
    Points
    130
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,

    Il faut TOUJOURS traiter tous les flux d'entrée/sorties, ou bien les fermer si on ne les utilise pas !!!

    Dans ta commande tu utilises "more" qui doit sûrement attendre une saisie clavier sur son Stdin. Comme tu n'envoie rien ca reste bloqué...

    a++
    Il est vrai que je n'ai pas traité les autres flux, autant pour moi je corrige immédiatement

    Pour la commande j'ai utilisé celle trouvée dans la faq Windows ( Cf. faq ) cette même commande passé directement depuis l'invite de commande ne pose aucun problème sans devoir saisir autre chose. Mais depuis mon application ben non ça ne marche pas

    Ps : sans le more la réponse est la même à savoir aucune ... :s

  4. #4
    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
    Il te faut quand même traiter tous les flux. A moins de la connaître dans ses moindre recoin, tu ne sais pas comment peut réagir une application lorsqu'elle n'est pas associé à un terminal. Elle peut tout à fait tenter de lire son flux d'entrée, ce qui est bloquant si tu ne le fermes pas...

    Enfin si tu ne lis pas le flux d'erreur, tu peux passer à coté d'un message d'erreur (ProcessBuilder permet de lier les deux flux de sortie stdout/stderr, ce qui permet de se contenter de lire le stdout sans pour autant ignorer le flux d'erreur)

    De plus il est préférable de découper chaque paramètre indépendamment et d'utiliser ProcessBuilder, ce qui donnerait :
    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
    final Process process = new ProcessBuilder("wmic", "Process", "where", "Name=\"" + apps + "\"", "GET", "processid")
    	.redirectErrorStream(true) // redirection STDERR dans STDOUT
    	.start();
    try {
    	// on ferme les flux inutilisés
    	process.getOutputStream().close();
    	process.getErrorStream().close();
     
    	// on lit le flux STDOUT (et STDERR puisqu'il y est redirigé)
    	BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "IBM850")); 
    	try {
    		String s;
    		while ((s = reader.readLine()) != null) { 
    			System.out.println("PID : " +s);
    		}
    	} finally {
    		reader.close();
    	}
    	int result = process.exitValue();
    } finally {
    	// garde-fou au cas où le process part en live...
    	process.destroy();
    }
    Je n'ai pas testé le code, mais ca devrait déjà être mieux...

    a++

  5. #5
    Membre habitué Avatar de Jose.N70
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2009
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2009
    Messages : 162
    Points : 130
    Points
    130
    Par défaut
    Effectivement ça marche beaucoup mieux ^^.

    - Je n'avais jamais utilisé ProcessBuilder, qui est intéressant pour la fusion des flux de sortie et d'erreur, merci déjà pour ce plus

    - Effectivement comme tu me l'as fait remarquer lire l'ensemble des flux est important, si j'avais lu le flux d'erreur j'aurais trouvé la réponse ( ce flux m'indiquait une erreur )

    Merci à toi pour ton aide.

    Bonne soirée ( ou nuit )

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/05/2014, 18h06
  2. Commande dos qui nous envoie l'espace disque restant
    Par soulsidibe dans le forum Autres Logiciels
    Réponses: 14
    Dernier message: 09/06/2011, 00h09
  3. commande SQL qui ne fonctionne pas
    Par Flavien44 dans le forum VBA Access
    Réponses: 5
    Dernier message: 13/06/2007, 16h40
  4. [Système] Commande system qui ne marche pas
    Par marie59 dans le forum Langage
    Réponses: 7
    Dernier message: 16/05/2007, 17h40
  5. [VB.NET]Form qui ne répond pas
    Par Pocel dans le forum Windows Forms
    Réponses: 5
    Dernier message: 17/07/2006, 10h42

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