Script linux executé à partir d'un code java qui marche pas

cs_ledawa Messages postés 6 Date d'inscription mardi 2 mai 2006 Statut Membre Dernière intervention 15 mars 2008 - 12 mars 2008 à 10:25
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 - 12 mars 2008 à 11:55
Bonjour
j'ai un script Linux qui fonctionne parfaitement. j'ai donc écrit un code Java qui normalement doit me permettre d'executer le script mais quand je lance le code il marche normalement mais le script ne s'execut pas.


voila le code de mon programme Java


import java.io.*;


public class Test
{


        public static void main(String[] args)


        {
                try
                {
                        String[] commands = {"/home/harold/script"};
                        Runtime.getRuntime().exec(commands);
                        System.out.println("merci");
                }
                catch (IOException e)
                {
                         System.err.println("ca marche pas");
                }
        }
}

le message "merci " s'affiche mais le script ne s'execut pas.
pouvez vous me dire quoi faire s'il vous plait. je voudrais savoir aussi comment afficher la sortie d'une commande linux (executée à partir d'un code Java) à l'écran?'
merci

3 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
12 mars 2008 à 11:01
Salut,

avant toutes choses, il serait bien de préciser le shell à utiliser dans ta commande... java réagit très mal sur certaines distributions quand tu ne précises pas le shell à utiliser... de plus cette manip permet d'eviter de tester si le script est exécutable ou non...
Pour la manipulation des flux stderr, stdout et stdin il te faut utiliser l'objet java.lang.Process qui est retourné à l'appel de la méthode "exec".

voici un sample (jdk 1.5 mini) de ce qui est dit ci-dessus :
import java.io.File;
import java.io.PrintWriter;
import java.util.Scanner;

public class ShellExec {

    public static void main(String[] args) throws Exception {
        String scriptName = "/tmp/cat_proc.sh";
        File f = new File(scriptName);
        // création du script
        makeScript(f);
       
        //exécution du script
        Process proc = Runtime.getRuntime().exec("/bin/bash " + scriptName);
        //récupération de stdout
        Scanner sc = new Scanner(proc.getInputStream());
        //lecture
        while(sc.hasNextLine())
            System.out.println(sc.nextLine());
        sc.close();
        //supprime le script
        f.delete();
    }
   
    /*
     * bon tu pourrais le faire dirrectement dans la méthode
     * "exec" et ne pas passer par un script mais ça ne répondrait
     * pas directement à la question
     */
    private static void makeScript(File f) throws Exception {
        PrintWriter pw = new PrintWriter(f);
        pw.println("#!/bin/bash");
        pw.println();
        pw.println("cat /proc/cpuinfo");
        pw.println();
        pw.flush();
        pw.close();
    }
}

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

OoWORAoO
0
cs_ledawa Messages postés 6 Date d'inscription mardi 2 mai 2006 Statut Membre Dernière intervention 15 mars 2008
12 mars 2008 à 11:32
j'ai executé ce code mais il m'envoie des messages du genre Exception in thread "main" java.lang.NoClassDefFoundError: While resolving class: Test2
voilà mon code
import java.io.File;
import java.io.PrintWriter;
import java.util.Scanner;




public class Test2
 {


    public static void main(String[] args) throws Exception
        {
        String script = "/home/harold/script.sh";
        File f = new File(script);
        // créion du script
        makeScript(f);


        //exétion du script
        Process proc = Runtime.getRuntime().exec("/bin/csh " + script);
        //répétion de stdout
        Scanner sc = new Scanner(proc.getInputStream());
        //lecture
        while(sc.hasNextLine())
            System.out.println(sc.nextLine());
        sc.close();
        //supprime le script
        f.delete();
         }


     private static void makeScript(File f) throws Exception {
        PrintWriter pw = new PrintWriter(f);
        pw.println("#!/bin/csh");
        pw.println();
        pw.println("cat /proc/cpuinfo");
        pw.println();
        pw.flush();
        pw.close();
    }
}

de plus je comprends pas pourquoi tu crés un autre script (partie en gras)? j'ai precisé le shell dans le script c'est le csh.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
12 mars 2008 à 11:55
Salut,

"j'ai executé ce code mais il m'envoie des messages
du genre Exception in thread "main" java.lang.NoClassDefFoundError:
While resolving class: Test2"
> Le code tourne très bien sur les postes où je l'ai testé. (javac ShellExec.java && java ShellExec)

"de plus je comprends pas pourquoi tu crés un autre script (partie en gras)"
> Il faut bien exécuter un script pour l'exemple...

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

OoWORAoO
0
Rejoignez-nous