Processus Shell et Récupération de Paramètres

Maiku Messages postés 190 Date d'inscription dimanche 10 avril 2005 Statut Membre Dernière intervention 4 juillet 2007 - 13 juin 2007 à 10:04
Twinuts Messages postés 5373 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 10 août 2022 - 13 juin 2007 à 10:56
Bonjour

Actuellement en stage, je developpe une application web dynamique en Java/J2EE ave principalement des pages JSP.

Cette application est deployée sur un Serveur Linux avec le Serveur d'Application JBOSS 4.0.5 ( Container Tomcat 5.5.20 il me semble) et tourne avec un J.D.K 1.4.06 (jdk imposé).

Mon application java doit appeler une application Korn Shell existante et lui passer des parametres, et dans un deuxième temps en récupérer.

Voici le code actuel que nous utilisons pour faire nos tests :
String param1 = "nom_projet";
String param2 = "nom_user";
String param3 = "num_dt";
out.println("test de l'appel ksh
");
try
{
Runtime rt = Runtime.getRuntime();
proc = rt.exec(System.getProperty("file.separator")+"produits"+System.getProperty("file.separator")+"adm_DT"+System.getProperty("file.separator")+"Creation_DT"+System.getProperty("file.separator")+"Creation_DT_test.ksh "+" "+param1+" "+param2+" "+param3);

// Consommation de la sortie standard de l'application externe dans un Thread separe
try
{
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = "";
try {
while((line = reader.readLine()) != null)
{
out.println("Sortie : "+line);
}
} finally {
reader.close();
}
} catch(IOException ioe) {
ioe.printStackTrace();
};

// Consommation de la sortie d'erreur de l'application externe dans un Thread separe
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
String line = "";
try {
while((line = reader.readLine()) != null) {
out.println("Erreur : "+line);
}
} finally {
reader.close();
}
} catch(IOException ioe) {
ioe.printStackTrace();
}

}
catch(IOException e)
{
out.println("Fichier non trouvé : "+e.getMessage());
}
catch(Exception e)
{
out.print("Une Erreur a eu Lieu :"+e.getMessage());
}

Pour le moment voici ce qui marche :

- le script ksh est bien trouvé, correctement appelé et executé
- il recupere bien les parametres puisque le programme(ksh) redirige les parametres recuperée dans un fichier log

Pour ce qui est de l'affiche des erreurs ou des parametres, rien n'est renvoyé, ou alors c'est que du "null".

Normalement le programme ksh renvoi "exit $code_retour" avec $ code_retour qui vaut 0.

Je cherche a récupérer cette valeur et à l'afficher sur la page JSP du serveur.

Quelqu'un peut-il m'aider car j'ai déjà usé par mal de solution .?
Merci d'Avance pour vos réponses

Maiku

1 réponse

Twinuts Messages postés 5373 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 10 août 2022 110
13 juin 2007 à 10:56
Salut,

pour ce qui est de la recup. du code de sortie tu peux le faire avec 'exitValue()' mais faut le faire apres le 'waitFor()' sinon tu vas te manger une exception
et pour la recup des flux tu pourrais faire un Thread que tu lances apres le 'exec' et que tu stop apres le waitFor...

exemple de Thread

public class ReadStream extends Thread {

    private InputStream    is        = null;
    private boolean        stdErr    = false;
    private boolean        end        = false;

    public ReadStream(InputStream is, boolean stdErr) {
        this.is = is;
        this.stdErr = stdErr;
    }

    public void end() {
        end = true;
    }

    public void run() {
        while(!end) {
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String line = null;
                while((line = br.readLine()) != null)
                    if (stdErr)
                        System.err.println(line);
                    else System.out.println(line);
                br.close();
                sleep(100);
            }
            catch(Exception e) {
                end = true;
            }
        }
    }
}

tu fais ton exec ensuite :
ReadStream stdOut = new ReadStream(proc.getInputStream(), false);
stdOut.start();

ReadStream stdErr = new ReadStream(proc.getErrorStream(), true);
stdErr.start();

proc.waitFor();
stdOut.end();
stdErr.end();
int exitCode = proc.exitValue();

enfin un truc du style ^^

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0