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 :

[Système]commandes linux / unix depuis java


Sujet :

API standards et tierces Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 21
    Points : 15
    Points
    15
    Par défaut [Système]commandes linux / unix depuis java
    Bonjour,

    j'ai déjà posté il y a quelques jours à ce sujet, mais je ne retrouve pas le message.

    Mon but était de lancer une commande shell (sh ou bash) depuis java, par exemple hdparm :
    depuis le shell, cela donne par exemple :
    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
     
    Runtime r = Runtime.getRuntime();
        	Process p = null;
        	String REGEX = null;
        	String INPUT = null;
    		try {
    			p = r.exec(new String[] {"/bin/sh", "-c", "hdparm -i /dev/hda | grep SerialNo"});
    			p.waitFor();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
        	BufferedReader br = new BufferedReader(new InputStreamReader(
    				p.getInputStream()));
    			REGEX = "SerialNo";
    		INPUT = br.readLine();
    Le 'INPUT' permettant de récupérer la sortie standard de la ligne de commande.

    Mon problème est que je veux faire la même chose avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    p = r.exec(new String[] {"/bin/sh", "-c", "scsiinfo -s /dev/sda"});
    or dans ce cas précis, INPUT renvoie 'null'.
    Pourtant la commande fonctionne très bien depuis le shell.

    Une idée pour me dépanner ?

  2. #2
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    je suppose que ton tableau de String c'est pour faire executer 3 commandes unix a la suite.
    Si tel est le cas, pourquoi ne pas utiliser qu'un seul String (meme si tu l'encapsule dans un tableau de string, ouais j'avais lu ton ancien post)
    Sous unix, tu peux en une ligne executer plusieurs commandes les une apres les autres. Par exemple si tu veux aller dans le dossier parents puis lister
    tu ferais:
    (meme si on fais généralement "ls .." lol)
    donc pour avoir en une ligne ces deux commandes tu peux aussi faire
    le point-virgule te permet de faire ça, donc tente d'utiliser ça plutot que 3 commandes dans un tableau de String
    Colère et Haine mènent à la Puissance

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Merci pour ta réponse,
    il est en effet plus judicieux de lancer l'ensemble des commandes shell en même temps (pool de commande shell :-) ) et d'en récupérer le résultat ensuite.

    Je laisse ce sujet en suspend, le résultat de la ligne de commande "scsiinfo /dev/sda" ne fonctionne toujours pas :-/
    Je pense que c'est un bug à soumettre chez Sun. Voici mon code remanié :
    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
     
    	private void setLinuxHdId() throws IOException
        {	
    		Runtime r = Runtime.getRuntime();
        	Process p = null;
        	String REGEX = null;
        	String INPUT = null;
    		try {
    			/*p = r.exec(new String[] {"/bin/sh", "-c",
    					"hdparm -i /dev/hda | grep SerialNo ; scsiinfo -s /dev/sda"}); */
    			p = r.exec(new String[] {"/bin/sh", "-c", "hdparm -i /dev/hda | grep SerialNo"}); 
    			p.waitFor();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		// on teste tout d'abord si le disque est ide
    		REGEX = "SerialNo";
    		// lit l'entrée ide
    		INPUT = readLine(p);
    		Pattern pattern = null;
    		Matcher matcher = null;
    		pattern = Pattern.compile(REGEX);
    		matcher = pattern.matcher(INPUT);
     
    		String snValue = null;
    		// test ide
    		if(matcher.find())
    		{
    			snValue = (INPUT.substring(matcher.end() + 2));
    			snValue = snValue.substring(0, snValue.length() - 1);
    		}
    		// sinon le disque est scsi
    		/*else
    		{*/
    	/*		REGEX = "Serial Number";
    			//ligne blanche
    			INPUT = readLine(p);
    			// pas de lecture de la sortie scsi (bug) INPUT= null !!!!
    			INPUT = readLine(p);
    			pattern = Pattern.compile(REGEX);
    			matcher = pattern.matcher(INPUT);
    			snValue = null;
    			if(matcher.find())
    			{
    				snValue = INPUT.substring(matcher.end() + 1);
    			}*/
    		//}
    		serialNumber = snValue;
    	}
    Marc

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Je présume prétentieusement que mon bug provient en fait d'un bug du jdk.
    Pour ceux qui voudraient par le plus grand des hasards travailler dessus, le code source se trouve ici : http://msiramy.free.fr/programmes/diskId.tar.gz

  5. #5
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Oui, effectivement c'est bien prétentieux.

    En plus, où se trouve ce fameux bug?

    Peux-tu tester ce code:
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.StringBufferInputStream;
    import java.util.HashMap;
     
    /*
     * Created on 13.09.2005
     *
     * To change the template for this generated file go to
     * Window>Preferences>Java>Code Generation>Code and Comments
     */
     
    /**
     * @author marfab001
     * 
     * To change the template for this generated type comment go to
     * Window>Preferences>Java>Code Generation>Code and Comments
     */
    public class TestProcess {
     
        private Runtime runtime;
        Process process = null;
        ByteArrayOutputStream error;
     
        public TestProcess() {
           runtime = Runtime.getRuntime();
           error = new ByteArrayOutputStream(1024);
        }
     
        public int execute(String[] args,
                           final OutputStream outStream,
                           final InputStream inpStream,
                           final OutputStream errStream,
                           final long timeout) throws IOException {
        	process = runtime.exec(args, null, null);
     
        	new Thread() {
                public void run() {
                	try {
    					BufferedInputStream errStreamProcess =
    					    new BufferedInputStream(process.getErrorStream());
    					byte[] buffer = new byte[128];
    					int read;
     
    					while ((read = errStreamProcess.read(buffer, 0, buffer.length)) != -1) {
                            if (errStream != null) {
                            	errStream.write(buffer, 0, read);
                            }
    					}
    					errStreamProcess.close();
    				} catch (IOException ioe) {
    					// TODO Auto-generated catch block
    					ioe.printStackTrace();
    				}
                }
        	}.start();
     
     
            new Thread() {
                public void run() {
                    try {
                        BufferedInputStream outStreamProcess =
                            new BufferedInputStream(process.getInputStream());
                        byte[] buffer = new byte[128];
                        int read;
     
                        while ((read = outStreamProcess.read(buffer, 0, buffer.length)) != -1) {
                            if (outStream != null) {
                            	outStream.write(buffer, 0, read);
                            }
                        }
                        outStreamProcess.close();
                    } catch (IOException ioe) {
                        // TODO Auto-generated catch block
                        ioe.printStackTrace();
                    }
                }
            }.start();
     
            if (inpStream != null) {
            new Thread() {
            	public void run() {
            		try {
    					BufferedOutputStream inpStreamProcess = 
    					    new BufferedOutputStream(process.getOutputStream());
    					byte[] buffer = new byte[256];
    					int read;
     
    					while ((read = inpStream.read(buffer, 0, buffer.length)) != -1) {
    					    inpStreamProcess.write(buffer, 0, read);
    					}
    				} catch (IOException ioe) {
    					// TODO Auto-generated catch block
    					ioe.printStackTrace();
    				}
                }
            }.start();
            }
     
            int status = -1;
            if (timeout > 0L) {
              Thread waitFor = new Thread() {
                public void run() {
                    try {
                    	process.waitFor();
                    }
                    catch(InterruptedException ie) {
                    	ie.printStackTrace();
                    }
                }
            };
            waitFor.start();
     
            try {
    			waitFor.join(timeout);
                try {
                	status = process.exitValue();
                }
                catch (IllegalThreadStateException itse) {
                	process.destroy();
                    status = process.exitValue();
                }
    		} catch (InterruptedException ie) {
    			ie.printStackTrace();
    		}
            }
            else if (timeout == 0L) {
                try {
    				status = process.waitFor();
    			} catch (InterruptedException ie) {
    				// TODO Auto-generated catch block
    				ie.printStackTrace();
    			}
        }
     
            return status;
        }
     
    	public static void main(String[] args) throws Exception{
           TestProcess process = new TestProcess(); 
           try {
            ByteArrayOutputStream out = new ByteArrayOutputStream(5 * 1024);
            ByteArrayOutputStream err = new ByteArrayOutputStream(1024);
     
            String[] cmd = {"/bin/sh", "-c", "hdparm -i /dev/hda | grep SerialNo"}; 
    		int status = process.execute(cmd, out, null, err, 60000);
            if (status == 0) { // Traitement du résultat
               String output = out.toString();
     
               System.out.println(output);
               /* TODO: Ton traitement du résultat */
            }
            else { // Traitement de l'erreur
                String error = err.toString();
     
                System.err.println(error);
                /* TODO: Ton Traitement d'erreur */
            }
     
    	} catch (IOException ioe) {
    		// TODO Auto-generated catch block
    		ioe.printStackTrace();
    	}
    	}
    }
    Bien le bonjour chez vous
    Jowo

  6. #6
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Tu as essaye de lire le ErrorStream au cas ou ?
    Romain Guy
    Android - Mon livre - Mon blog

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    ok,
    merci beaucoup pour les réponses et jowo pour ton code qui tourne à merveille.
    J'ai vu que je manquais de notions sur les Threads et les entrées sorties (buffers) et je remets la dessus pour bien comprendre.

    Dans le code, il y a 3 threads :
    - un pour le buffer pr la sorite std (128 bits)
    - un pour le buffer d'erreur, (128 bits)
    - un pour le buffer d'entrée (128+128=256 bits)

    Je ne pense pas modifier ton code de trop (vu comment il marche !),
    je pense avoir compris pourquoi tu encapsulais les différents flux dans des threads,
    ça serait, si j'ai bien lu le tuto de Sun, la thread se met en attente tant que le flux de caractere n'est pas récupéré.
    De fait, cela permet, contrairement à ma première version du code, de récupérer la sortie de n'importe quelle commande shell meme si celle si est lente à exécuter.

    Quelques questions ?
    - les buffers sont ils indispensables (je pense à l'utilisation des notify) ?
    - Que signifie 0L dans 'timeout == 0L' ?
    Je pense ne pas avoir tout à fait compris encore comment les timeout étaient utilisés dans le programme.
    Je regarderai à nouveau demain.

    Marc

    Gfx -> apparemment rien n'est écrit dans le ErrorStream.
    A moh avis , la commande scsiinfo ... est plus longue à exécuter que hdparm .
    Je pensais qu'un petit process.wait() suffisait pour attendre que l'écriture du flux se passe bien mais c'était une erreur. Seule une Thread encapsulant le process permet de garantir la "capture" d'un flux.

    Bon, je sais po si ma dernière phrase est bien claire à cette heure, je repasserai par là demain

  8. #8
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    - Que signifie 0L dans 'timeout == 0L' ?
    Un nombre suivi d'un L (ou l) indique que le nombre doit etre traite comme un type long. De meme tu peux utiliser D/d et F/f pour preciser des doubles et des floats. Tu peux aussi commencer un nombre par 0 pour indiquer une valeur octale, commencer par 0x ou 0X pour un nombre en hexadecimal, utiliser e pour les puissances de 10 (exemple float test = 35.8E+3). Voila voila
    Romain Guy
    Android - Mon livre - Mon blog

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 21
    Points : 15
    Points
    15
    Par défaut [Résolu]
    Ok, merci beaucoup pour toutes les explications,
    le programme complet se trouve ici : http://msiramy.free.fr/index.php?section=programmes .

    - Marc

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 21
    Points : 15
    Points
    15
    Par défaut [Resolu] commandes linux / unix depuis java
    resolu

  11. #11
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut Re: [Resolu] commandes linux / unix depuis java
    Salut,

    Citation Envoyé par msiramy
    resolu
    Pour mettre le tag [Resolu] il faut cliquer sur le bouton en bas à gauche de la page

    Pour cette fois je le met à ta place

    a++

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3
    Points : 3
    Points
    3
    Par défaut attente fin de command shell en java
    Bonjour,

    Un problème proche :

    La commande système que je dois utiliser est
    /home/perso/outils/Mon_package/Progs/./RNAsubopt -T 37 <entree.txt | sort +1n > sortie.txt

    J'essaie d'utiliser la classe fournie par
    http://www.developpez.net/forums/sho...commande+shell
    [Résolu] [Système]commandes linux / unix depuis java
    msiramy,
    classe rebaptisée CommandLineProcess dans ce qui suit.

    Dans ma fonction main, j'ai donc ce qui suit mais est incomplet :

    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
    process = new CommandLineProcess(); 
       try {
        ByteArrayOutputStream out = new ByteArrayOutputStream(5 * 1024);
        ByteArrayOutputStream err = new ByteArrayOutputStream(1024);
        ByteArrayInputStream  in  = new ByteArrayInputStream(5 * 1024);
     
     
        //String[] cmd = {"/bin/sh", "-c", "hdparm -i /dev/hda | grep SerialNo"}; 
        //int status = process.execute(cmd, out, null, err, 60000);
     
        <<<<<<<Je ne sais pas faire le lien entre entree.txt et in>>>>>>
     
        int status = process.execute(commandLineRNASubopt, out, in, err, 60000);
        if (status == 0) { // Traitement du résultat
         String output = out.toString();
         System.out.println(output); // à écrire sur sortie.txt
         /* TODO: Ton traitement du résultat */
        } else { // Traitement de l'erreur
         String error = err.toString();
         System.err.println(error);
         /* TODO: Ton Traitement d'erreur */
        }     
       } catch (IOException ioe) {
         // TODO Auto-generated catch block
         ioe.printStackTrace();
         }
    Merci à qui pourra m'aider.

  13. #13
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Je pense que ce qui pose probleme est la redirection de l'entree standard de ton process unix: "<entree.txt", sans compter que je ne sais pas non plus quel effet pourrait avoir le "|", meme constat pour la redirection de la sortie standard

    En effet java effectue lui meme une redirection des entrees et sorties standard, du coup l'appel ne peux plus fonctionner.

    Par contre si tu copies ce code dans un autre script shell et que tu execute ce nouveau script, la cela devrait marcher.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 28/04/2009, 09h20
  2. [Système] Commande Linux via PHP
    Par musix77 dans le forum Langage
    Réponses: 1
    Dernier message: 31/07/2008, 12h57
  3. [Système] Commande Linux dans Programme PHP
    Par makohsarah dans le forum Langage
    Réponses: 3
    Dernier message: 10/09/2007, 12h36
  4. [Système] Commande Linux avec php
    Par Tazerty dans le forum Langage
    Réponses: 3
    Dernier message: 30/08/2007, 22h09
  5. [débutant]lancement d'une commande Unix ou LInux depuis Java
    Par msiramy dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 30/09/2005, 18h10

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