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 :

[Runtime] Shell et flux d'entrée sortie


Sujet :

API standards et tierces Java

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 24
    Points
    24
    Par défaut [Runtime] Shell et flux d'entrée sortie
    Bonjour,

    Voilà, Pour l'instant j'écris le truc suivant pour windows : lancer une fenêtre shell (cmd), puis lancer dedans une commande système (sipp, un programme dans le path). Il faut donc récupérer le flux d'entrée de ce process pour écrire dedans c'est bien ça ? On aurait donc un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Runtime r = Runtime.getRuntime();
    String[] args = { "cmd.exe", "/C", "start cmd " };
     
    try {
           Process p = r.exec(args);
     
           BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
           bw.write("sipp");
           bw.close();
    }
    Le problème c'est que dans la fenêtre shell qui s'ouvre, rien ne se passe... Au passage, est-ce que passer par Runtime est la bonne méthode pour lancer une application externe ? Y-a-t-il mieux ?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    pourquoi lancer cmd.exe plutot que sipp directement? Parce que là, tu lance cmd à qui tu demande de lance cmd et à qui t'essaie de faire croire qu'on a écrit sipp sur la ligne de commande. Hors le stream de ton process, il me semble est limité au premier cmd.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Eh bien l'application s'exécute en mode console, et j'aimerais laisser à l'utilisateur le loisir d'interagir avec la fenetre console qui s'ouvrirait. Si je fais directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    String[] args = { "cmd.exe", "/C", "start sipp" };
     
    try {
           Process p = r.exec(args);
           .....
    }
    Une fenetre shell s'ouvre, lance l'appli, et se referme aussitôt. Donc c'est plus une question concernant Windows. En regardant l'aide de start, je n'ai pas trouvé un moyen d'empêcher cette fenêtre de se ferme, ce qui nous ramène à ma première question.

    Mais je me demandais : comment faire pour lancer cette appli dans une fenetre console autonome et ce, indépendemment de la plateforme cible. Ici, c'est du Windows, donc je fais cmd.exe, mais sur du Linux ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    sous linux: xterm, gnome-terminal, konsole suivant ce qui est disponible.


    Pour ton problème de console qui disparait avant que l'application sipp ne se termine et ne permet pas d'interagir, retire ce "start", car d'après la doc:

    START

    Start a specified program or command in a separate window.
    Ca combiné au /C:

    /C Carries out the command specified by string and then terminates
    est la source de tes problèmes. Ceci devrait suffir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    String[] args = { "cmd.exe", "/C" "sipp" };
     
    try {
           Process p = r.exec(args);
           .....
    }
    Si tu veux garder la console après l'arret de sipp, remplace le /C par /K

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    En fait, j'utilise le start (separate window) car l'appli en question est justement une appli console.
    En lançant comme tu dis ("cmd.exe", "/C" "sipp" } ), rien n'est affiché. Pour prendre un exemple, prenons à la place de sipp ipconfig :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    String[] args = { "cmd.exe", "/C", "ipconfig" };
     
    try {
           Process p = r.exec(args);
           .....
    }
    En lançant ça, je n'ai rien qui s'affiche.
    EDIT : Je précise que je lance l'archive jar de mon projet dans un shell :
    > java -jar mon_projet.jar
    C'est dans ce shell que rien n'est affiché lors de l'exec d'ipconfig.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    par défaut, quand tu lance un process c'est à tout de pomper son outputstream pour l'afficher ou tu veux, et de remplir le inputstream avec les commande à envoyer. T'auras peut -être plus de chance en bidouillant comme çà:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] args = { "cmd.exe", "/C", "start", "cmd.exe", "/C", "sipp" };

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Yep, ça marche en remplaçant le dernier /C par /K pour que ça continue après le lancement de la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] args = { "cmd.exe", "/C", "start", "cmd.exe", "/K", "sipp" };
    Merci tchize_

    Petite question : Y-t-il un moyen de rendre ce code plus portable de façon à ce qu'il fonctionne à la fois sous Windows et sous Linux ?
    J'imagine qu'il faut tester un critère pour voir dans quel OS on se trouve...

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    non seulement tester l'os en cours, mais tester avec quoi travailler (xterm, gnome-terminal, autres?) Ton modèle, par exemple, ne pourra pas marcher pour une commande lancée depuis un shell ssh par exemple, car là la notion de fenetre n'existe pas et donc impossible d'ouvrir une nouvelle fenetre.

    Si tu veux être 100% générique, il faut lancer sipp directement (sans passer par des cmd.exe), prendre ses input / ouput (sur l'objet process) et faire toit même le travail de transfert de données de ceux-ci vers l'écran / clavier de ton process à toi.

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    OK, dans un premier temps je pense lancer sipp indirectement via ce shell.

    Pour déterminer dans quel os on se trouve, là il suffit de voir les properties du système, mais pour le shell...il faut que j'aille voir à la main dans l'arborescence le nom du shell ?

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le problème, c'est que c'est pas le shell que tu dois lancer, mais une fenetre. "start" démarre une fenetre séparé, dans le cas du shell cmd.exe, sous linux, y a plusieurs applications de terminal (xterm, gnome-terminale, konsole, ....) disponible, mais leur disponibilité dépend (faut tester leur présence). Le shell qu'elle exécutent c'est encore quelque chose à part (et à priori, t'as pas besoin de lancer un shell)

  11. #11
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Ok, c'est en effet les applications de terminal plutôt que le shell qu'il faut que je regarde. Donc pour tester leur présence je pourrai faire un truc du genre tester dans les répertoires des exécutables (/bin, /user/bin, ...) la présence de xterm par exemple ?

  12. #12
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Aide moi
    Bonjour ,

    S'il vous plaît comment je peut lancer l'outil SIPp a distance via un code java sur eclipse ?

    OS: ubuntu 12.04 lts


    Merci d'avance.

Discussions similaires

  1. Livre sur les flux d'entrée/sortie
    Par oodini dans le forum Livres
    Réponses: 3
    Dernier message: 04/04/2014, 17h41
  2. Réponses: 0
    Dernier message: 24/04/2012, 21h30
  3. Flux d'entrée/sortie par référence.
    Par max_batteur_fou dans le forum C++
    Réponses: 3
    Dernier message: 13/01/2011, 23h54
  4. Flux entrée sortie avec Struts
    Par stef_ich dans le forum Struts 1
    Réponses: 0
    Dernier message: 10/04/2010, 14h57
  5. Flux entrée sortie et exceptions
    Par Magicien d'Oz dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 07/07/2006, 05h20

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