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 :

Blocage exécution shell via JSch


Sujet :

Java

  1. #1
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 45
    Par défaut Blocage exécution shell via JSch
    Bonjour,

    J'ai un petit outil graphique qui me permet d’exécuter des commandes shell via JSch. Le plus souvent je ne rencontre aucun problème à l’exécution des commande shell or pour certaine commande, JSch se bloque et ne me rend pas la main.
    Par exemple si je lui passe la commande oninit (pour démarrer une base informix) il se bloque. je passe cette même commande sur le serveur, je n'ai aucun problème, .

    Voici la méthode(ci-dessous) qu j'utilise pour passer les commande shell, je récupère le flux d’écriture standard de sortie ainsi que le flux d'erreur pour l'afficher dans un objet de type JtextArea.

    Merci pour votre aide.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
        public int executeCommand(String command) {
            int exitCode = -1;
            ChannelExec channel = null;
    		BufferedReader stdoutReader = null;
            BufferedReader stderrReader = null;
    		String line ;
    		String line_error="" ;
            try {
                channel = (ChannelExec) oSession.openChannel("exec");
     
                channel.setCommand(command + "\n");
     
                InputStream stdout = channel.getInputStream();
                InputStream stderr = channel.getErrStream();
     
                channel.connect();
     
                stdoutReader = new BufferedReader(new InputStreamReader(stdout));
                stderrReader = new BufferedReader(new InputStreamReader(stderr));
     
                //while (stdoutReader.read() != -1) {
                   while ((line = stdoutReader.readLine()) != null ||(line_error = stderrReader.readLine()) != null) {
                    //System.out.println(stdoutReader.readLine());
    				//System.out.println(line) ;
    				if(line_error.length() > 0)
    				{
    				textarea.append(line_error+"\n") ;
    				line_error="";
    				}
    				textarea.append(line+"\n") ;
     
    				textarea.repaint() ;
    				}
     //&& (line_error = stderrReader.readLine()) != null
                exitCode = channel.getExitStatus();
     
                return exitCode;
            } catch (IOException e) {
                System.out.println("Cannot execute remote command: " + command
                        + " : " + e.getMessage());
            } catch (Exception e) {
                System.out.println("Cannot execute remote command: " + command
                        + " : " + e.getMessage());
            } finally {
                try {
                    stdoutReader.close();
                    stderrReader.close();
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
                if (channel != null) {
                    channel.disconnect();
                }
            }
            return exitCode;
        }

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Alors, c'est pas forcément ça le problème, mais voilà ce que je peux imaginer :

    - Le programme oninit écrit des choses sur la sortie d'erreur, avant de fermer ses deux sorties.
    Si c'est le cas kesskisspass ?

    Dans ta boucle, tu commences par lire une ligne de la sortie standard. Ensuite, tu liras une ligne de la sortie d'erreur... Ouais mais, ça c'est ensuite. Tu lis d'abord une ligne de la sortie standard.
    Et une ligne de la sortie standard, ben il y en a pas. Du coup tu attends, tu attends, et il y en a toujours pas : le programme n'envoie aucune fin de ligne et ne se ferme pas, parce que tu n'as toujours pas commencé à lire sa sortie d'erreur.

    Eh oui, il fallait d'abord lire sa sortie d'erreur.
    Sauf que pour la plupart des programmes c'est l'inverse. Et pour certains programme ça change en cours de route.
    Donc il faut lire les deux en parallèle.

    Concrètement tu dois créer un thread dédié à la lecture de la sortie d'erreur.
    Ton thread de départ, lui, s'occupera juste de la sortie standard, et quand il a fini, il attend la fin de l'autre thread.
    C'est comme ça qu'on doit faire pour respecter la norme. (En principe, on peut aussi se baser sur available(), mais sans buffeuriser.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 45
    Par défaut
    Merci pour ta réponse, mais je ne comprends pas bien car il n'y a aucune sortie d'erreur (quand je passe la commande en directe sur le serveur).

    Je vais tout de même essayer, il faut que je rajoute des threads à l' intérieure de la méthode ?

  4. #4
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 45
    Par défaut
    Je viens de faire un test avec la commande oninit -v qui permet de démarrer une base informix en mode verbose , et j'ai le même problème.

Discussions similaires

  1. Exécution de script shell via PHP
    Par Sayko dans le forum Langage
    Réponses: 1
    Dernier message: 13/03/2013, 23h17
  2. Exécuter un script shell via le fichier .mailrc
    Par Olivier Regnier dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 16/06/2007, 18h42
  3. Réponses: 8
    Dernier message: 07/05/2007, 11h03
  4. [Debutant]Commande SHELL via Delphi
    Par Vinceee38 dans le forum Delphi
    Réponses: 1
    Dernier message: 26/04/2007, 10h42
  5. [D7]TIdTelnet et exécution shells Unix
    Par super_boulet dans le forum Delphi
    Réponses: 4
    Dernier message: 14/12/2006, 17h46

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