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] Rediriger la sortie d'un processus


Sujet :

API standards et tierces Java

  1. #1
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 885
    Par défaut [Runtime] Rediriger la sortie d'un processus
    Bonjour

    En parcourant avec la fonction Rechercher, je me suis appuyé sur l'un des codes proposé. Mon objectif est de pouvoir afficher sur la sortie standard le résultat d'une commande Unix lancé à partir d'un code Java.
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try {
                Process process = Runtime.getRuntime().exec("ls /boot/config*");
                BufferedReader ds = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String lineCourante = ds.readLine();
                while (lineCourante != null) {
                    System.out.println(lineCourante);
                    lineCourante = ds.readLine();
                }
            }
    La commande en mode shell fonctionne. Par contre, à l'exécution, rien ne s'affiche !
    Donc, où est mon erreur ?

    Merci d'avance de vos réponses.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  2. #2
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    The Runtime.exec methods may not work well for special processes on certain native platforms, such as native windowing processes, daemon processes, Win16/DOS processes on Microsoft Windows, or shell scripts. The created subprocess does not have its own terminal or console. All its standard io (i.e. stdin, stdout, stderr) operations will be redirected to the parent process through three streams (Process.getOutputStream(), Process.getInputStream(), Process.getErrorStream()). The parent process uses these streams to feed input to and get output from the subprocess. Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.
    Ca voudrait dire que dans ton cas, le stream n'est peut-être pas renseigné..

    Si tel est le cas, et qu'aucune parade n'a été trouvée ( je viens de vérifier sur la doc 1.5.0 et c'est toujours la même chose ) il ne te reste plus qu'à faire un système de redirection de l'output de tes scripts shell vers un fichier de log.. Puis dans ton programme Java d'interroger ce dernier lorsque le process a fini.. Pas génial

    Peut-être quelqu'un a une idée ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Par défaut [Runtime] Rediriger la sortie d'un processus
    Ton code semble correct

    J'ai moi-même eu des ennuis avec ce type de programme où je ne n'ai pas pu récupérer le résultat de certaines commandes unix mais avecls ça marche à coup sûr.

    J'ai trouvé ce lien

    http://www.mountainstorm.com/publications/javazine.html

    qui fait la même chose

    son code est
    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
    import	java.io.*;
     
    class execInput {
        public static void main(String Argv[]) {
            try {
                String ls_str;
                Process ls_proc = Runtime.getRuntime().exec("/bin/ls -aFl");
    	    // get its output (your input) stream
                DataInputStream ls_in = new DataInputStream(
                          ls_proc.getInputStream())  ;
                try {
                    while ((ls_str = ls_in.readLine()) != null) {
                        System.out.println(ls_str);
    	        }
                } catch (IOException e) {
                    System.exit(0);
                }
            } catch (IOException e1) {
                System.err.println(e1);
                System.exit(1);
            }
            System.exit(0);
        }
    }
    A première vue la seule différence est l'utilisation de DataInputStream à la place de BufferedInputStream mais je ne pense pas que ce soit l'erreur surtout que tu transformes bien ton flux d'octets en flux de caractères avec InputStreamReader

    En espérant t'avoir aidé

    Sinon essaye avec un ls tout seul


  4. #4
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Travailles-tu en multi-threads ?

  5. #5
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 885
    Par défaut
    Bonsoir

    Merci de vos réponses, je vais tâcher de répondre à vos questions.
    parsy, j'ai essayé ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    try {
                Process process = Runtime.getRuntime().exec("ls /boot/config*");
                DataInputStream ls_in = new DataInputStream(process.getInputStream());
                String ls_str;
                while ((ls_str = ls_in.readLine()) != null) {
                    System.out.println(ls_str);
                }
            } catch (IOException ioe){
                JOptionPane.showMessageDialog(null, "Erreur pour renommer le fichier de configuration !", "Erreur", JOptionPane.ERROR_MESSAGE);
                System.exit(7);
            }
    Hélas, le résultat est le même, rien ne s'affiche.
    KiLVaiDeN : non, je ne travaille pas en multi-thread. Y a t'il une importance ?
    Sinon, j'ai bien peur de devoir faire ce que KiLVaiDeN me recommande mais je trouve cette solution bizarre, voir complètement alambiqué.
    Merci encore de votre aide.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  6. #6
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Je viens de voir quelque chose. En fait il vaudrait peut-être mieux séparer la commande, de ses arguments, donc l'idée de Parsy ( de tester uniquement avec un ls tout simple ) était pertinente.

    Pour séparer la commande de ses arguments, il faut utiliser un tableau de String :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Process 	exec(String[] cmdarray)
              Executes the specified command and arguments in a separate process.
    Sinon je vois pas, je parlais des threads car j'ai eu l'impression que ça pouvait poser un problème de lire le flux de retour d'un processus à partir d'un thread, ça ne doit poser aucun problème, mais dans ma tête ça fait un petit blocage

  7. #7
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868

  8. #8
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Le caractère joker '*' est interprétable par le shell (sh ou autre), et non par la comande ls. Plutôt que
    Process process = Runtime.getRuntime().exec("ls /boot/config*");
    il faudrait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String[] cmdarray = {"/bin/sh", "-c", "ls", "/boot/config*"};
    Process process = Runtime.getRuntime().exec(cmdarray);

  9. #9
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 885
    Par défaut
    Ok, je vais essayer aujourd'hui, je vous tiens au courant.
    Merci de votre aide !

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  10. #10
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 885
    Par défaut
    Salut

    herve91, j'ai testé ton code avec celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    try {
                String[]cmd = {"/bin/sh", "-c", "ls", "/boot/config*"};
                Process process = Runtime.getRuntime().exec(cmd);
                BufferedReader ds = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String lineCourante = ds.readLine();
                while (lineCourante != null) {
                    System.out.println(lineCourante);
                    lineCourante = ds.readLine();
                } 
            } catch (IOException ioe){
                JOptionPane.showMessageDialog(null, "Erreur pour renommer le fichier de configuration !", "Erreur", JOptionPane.ERROR_MESSAGE);
                System.exit(7);
            }
    Là, j'ai un résultat qui s'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    build
    build.xml
    dist
    manifest.mf
    nbproject
    src
    test
    Et oui, ça me liste les fichiers...mais du répertoire de mon projet
    Mais bon, un peu de courage, je pense que je touche au but.
    Merci de votre aide.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  11. #11
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Oups, oui, je viens de voir l'erreur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[]cmd = {"/bin/sh", "-c", "ls /boot/config*"};
    Ca devrait aller mieux comme ça...

  12. #12
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 885
    Par défaut
    Nickel chrome !

    Un grand merci à toi herve91 ainsi qu'à KiLVaiDeN et parsy
    Ca marche impeccable !

    A charge de revanche !

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  13. #13
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Deux questions que je me pose quand même :

    Le fait de passer par le shell pour lancer ls, est-ce obligatoire, ou seulement parce qu'il voulait utiliser le joker ? Parce que je suis un peu gêné par le fait que ça implique d'instancier sh, ça serait plus optimisé d'appeller directement ls non ? Et d'ailleurs, quand on appelle sh de cette façon, est-ce que ça crée un processus sh, qui lui même crée un processus ls ?

    La méthode exec peut aussi prendre un paramètre envp, qui est un String[]. A quoi correspond ce paramètre ? Je n'ai jamais vu d'exemple à ce sujet, dans la docs ils parlent de variables d'environnement, mais je ne comprend pas bien l'utilisation qu'on puisse en avoir, bien que je sache ce qu'est une variable d'environnement..

    Est-ce que ça aurait marché si dans la configuration initiale, la commande avait été un "ls" tout simple ? As-tu testé ?

    Merci de m'eclairer

  14. #14
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Le fait de passer par le shell pour lancer ls, est-ce obligatoire, ou seulement parce qu'il voulait utiliser le joker ? Parce que je suis un peu gêné par le fait que ça implique d'instancier sh, ça serait plus optimisé d'appeller directement ls non ? Et d'ailleurs, quand on appelle sh de cette façon, est-ce que ça crée un processus sh, qui lui même crée un processus ls ?
    Effectivement, c'est uniquement parce qu'il voulait utiliser le joker, qui est interprétable seulement par le shell. Oui aussi pour la seconde question, c'est plus optimisé en lançant directement ls (ça évite de créer un processus intermédiaire). Et enfin, oui pour la troisième question, il y a deux processus créés, le processus père "sh" attendant la fin du processus fils "ls".
    Citation Envoyé par KiLVaiDeN
    La méthode exec peut aussi prendre un paramètre envp, qui est un String[]. A quoi correspond ce paramètre ? Je n'ai jamais vu d'exemple à ce sujet, dans la docs ils parlent de variables d'environnement, mais je ne comprend pas bien l'utilisation qu'on puisse en avoir, bien que je sache ce qu'est une variable d'environnement.
    envp est un tableau de chaînes de caractères donnant la liste des variables d'environnement avec leur valeur. Chaque chaîne est de la forme par exempleSi tu ne précises pas "envp" au niveau du exec, c'est l'environnement du processus courant qui est passé. Tu peux avoir besoin de passer des informations au processus fils via les variables d'environnement, dans ce cas tu construis un "envp" en rapport.
    Citation Envoyé par KiLVaiDeN
    Est-ce que ça aurait marché si dans la configuration initiale, la commande avait été un "ls" tout simple ? As-tu testé ?
    Elle aurait marchait, oui

  15. #15
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Merci beaucoup pour ces précisions Hervé, bonne continuation !

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    496
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 496
    Par défaut
    Citation Envoyé par KiLVaiDeN
    ce lien ne marche plus. en as tu un autre ?

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/11/2014, 10h47
  2. [Runtime] Rediriger la sortie d'un processus
    Par aweqqas dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 01/09/2007, 08h20
  3. Réponses: 2
    Dernier message: 02/06/2007, 11h36
  4. rediriger la sortie standard vers un textarea
    Par gromite dans le forum Composants
    Réponses: 9
    Dernier message: 10/05/2004, 11h07
  5. Comment rediriger la sortie vers /dev/null
    Par dclink dans le forum C
    Réponses: 4
    Dernier message: 24/06/2003, 18h23

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