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

Langage Java Discussion :

Erreur lors de l'exécution d'une commande shell


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Par défaut Erreur lors de l'exécution d'une commande shell
    Bonjour,

    J'ai un petit problème assez récurrent dans mon application...
    Je dois effectuer des commandes shell, à savoir un mount et un umount. (j'ai également dû faire des iptables dans un autre projet mais j'ai contourné le problème).

    Voici ma méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cmdShell = "mount " + ligne + " " + cheminDisque;	
    try{
    	p = Runtime.getRuntime().exec(cmdShell);		
    }catch(IOException e){
    	Logger.getLogger().error("Erreur lors du montage d'une partition de disque");
    }
    Mon problème, c'est que de temps en temps, les commandes shell ne sont pas exécutée. Le code est bien exécuté comme il faut, mais la commande n'a aucun effet.

    Il ne s'agit pas d'une erreur dans la commande ou autre, puisque lancée plusieurs fois, la commande s'exécute. Je suis donc obligé de faire une boucle pour vérifier la presence ou non de données dans le repertoire ce qui me permet de savoir si le disque est monté. Tant que la commande n'a pas été approuvée, on boucle.

    voici un exemple de resultat :

    mount /dev/sda1 /media/disqueRecup/
    on demonte
    on demonte
    on demonte
    on demonte
    mount /dev/sda3 /media/disqueRecup/
    on demonte
    mount /dev/sdb1 /media/disqueRecup/
    disque trouve

    on peut voir que le mount se fait à chaque fois, (ce qui n'est pas toujours le cas) mais que les umount ne passe pas tout le temps.. pour le premier mount, il n'y a pas moins de 4 tentatives pour que la commande umount passe...

    J'obtiens le résultat que je veux avec ma boucle (technique que j'ai utilisé pour le iptables dans un autre projet) mais je trouve ça vraiment crade de devoir réitérer la commande jusqu'à ce qu'elle fonctionne...

    Y a t-il une autre méthode pour exécuter du shell ? Y a-t-il quelqu'un qui sait pourquoi ce phénomène se produit ?

    N'hésitez pas si vous avez la moindre informations, car cette erreur est totalement illogique à mes yeux !

    Merci beaucoup

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,



    Si ton code se limite à cela c'est normal (enfin si on peut dire).

    • Il est préférable de séparer les paramètres de la commande. Au passage depuis Java 5 on privilégiera ProcessBuilder aux méthodes Runtime.exec()...
    • Il faut toujours traiter les flux d'entré/sorties, ou alors les fermer pour éviter les deadlock. Au passage si tu as des problèmes il est préférable de lire le flux de sortie/d'erreurs pour voir s'il n'y a pas de problème (avec Processbuilder tu peux les regrouper c'est plus simple).
    • Le process peut mettre un "certain temps" à se lancer et s'exécuter. Il est donc préférable d'attendre qu'il soit fini (surtout dans ton cas).
    • A noter qu'en règle général les commandes unix utilise leurs code retour pour indiquer leurs déroulement. En règle général un code de retour qui vaut 0 indique un bon fonctionnement...




    Perso je remplacerais ton code par 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
    15
    	// On crée le process via un ProcessBuilder :
    	Process process = new ProcessBuilder("mount", ligne, cheminDisque).start();
    	try {
    		// On ferme les flux (puisqu'on ne les utilises pas)
    		process.getOutputStream().close();
    		process.getErrorStream().close();
    		process.getInputStream().close();
     
    		// On attend la fin du process :
    		int result = process.waitFor();
     
    	} finally {
    		// On détruit le process (garde-fou en cas de problème)
    		process.destroy();
    	}

    Ou si tu veux lire le flux de sortie standard et d'erreur :
    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
    	// On crée le process via un ProcessBuilder :
    	Process process = new ProcessBuilder("mount", ligne, cheminDisque)
    		.redirectErrorStream(true) // on redirige stderr dans stdout
    		.start();
    	try {
    		// On ferme les flux (puisqu'on ne les utilises pas)
    		process.getOutputStream().close();
    		process.getErrorStream().close();
     
    		// On lit le flux de sortie standard
    		// et on le recopie dans la sortie standard :
    		InputStream input = process.getInputStream();
    		try {
    			byte[] buf = new byte[8192];
    			int len;
    			while ( (len=input.read(buf)) >= 0 )
    				System.out.write(buf, 0, len);
    		} finally {
    			input.close();
    		}
     
    		// On attend la fin du process :
    		int result = process.waitFor();
     
    	} finally {
    		// On détruit le process (garde-fou en cas de problème)
    		process.destroy();
    	}

    a++

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Par défaut
    je te remercie de ta réponse !

    Je venais de passer sur des posts que tu avais déjà écrits ailleurs sur le site !
    je ne connaissais pas cette méthode, et google renvoie quasiment tout le temps sur le runtime.exec..

    Alors je viens de tester, et j'obtiens le même problème... sauf que cette fois, je peux voir le résultat de la commande grâce à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int result = process.waitFor();
    est ce normal que le umount ne se fasse pas systématiquement ? J'ai déjà été confronté à ce problème et sur google personne n'a l'air d'avoir le même... peut être que ça vient de ma machine..

    je garde cette méthode, puisque cette fois je peux boucler tant que le retour n'est pas égal à 0.

    je vais regarder a quoi correspondent les codes d'erreur (8 et 1 pour le moment).

    merci beaucoup !

    Sinon, si quelqu'un a déjà eu ce problème, la commande qui doit etre rappelé plusieurs fois car elle n'est pas toujours executée, qu'il me fasse signe !

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/10/2009, 11h38
  2. [XL-2003] Erreur lors de l'exécution d'une procédure
    Par pacocnec dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/06/2009, 12h39
  3. Erreurs lors de l'exécution d'une procédure
    Par vanesa dans le forum PL/SQL
    Réponses: 2
    Dernier message: 05/01/2009, 17h48
  4. Erreur lors de l'exécution d'une requête avec ADOquery
    Par doolar dans le forum Bases de données
    Réponses: 2
    Dernier message: 03/05/2008, 13h26
  5. [PostgreSQL] [PostGreSQL] Obtention d'une erreur lors de l'exécution d'une requête
    Par cbombabill dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/03/2008, 11h56

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