Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1796 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  execution de commande shell fonctionne une fois sur deux

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

execution de commande shell fonctionne une fois sur deux

n°2085893
dumoulex
Posté le 29-06-2011 à 15:20:04  profilanswer
 

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
 

Code :
  1. cmdShell = "mount " + ligne + " " + cheminDisque;
  2. try{
  3. p = Runtime.getRuntime().exec(cmdShell);
  4. }catch(IOException e){
  5. Logger.getLogger().error("Erreur lors du montage d'une partition de disque" );
  6. }

 
 
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  

mood
Publicité
Posté le 29-06-2011 à 15:20:04  profilanswer
 

n°2085907
Bidem
Posté le 29-06-2011 à 16:04:25  profilanswer
 

Citation :

Il ne s'agit pas d'une erreur dans la commande ou autre, puisque lancée plusieurs fois, la commande s'exécute.


Ça ne prouve rien.

 

Essaye de lire la sortie standard (p.getInputStream()) et/ou la sortie d'erreur (p.getErrorStream()) pour voir si ton script fait une erreur ou pas.


Message édité par Bidem le 29-06-2011 à 16:04:49
n°2085909
LeRiton
Posté le 29-06-2011 à 16:09:17  profilanswer
 

Pour un besoin de ce genre, j'ai utilisé la classe ProcessBuilder, qui permet en outre de rediriger les flux d'erreur et de sortie, de mapper les codes erreur et d'avoir une gestion (minimale) de l'attente pour le traitement du process lancé.

 

Edit : les ressources que j'ai utilisées.
http://stackoverflow.com/questions [...] ss-timeout
http://www.javaworld.com/javaworld [...] tml?page=4


Message édité par LeRiton le 29-06-2011 à 16:12:46
n°2085920
dumoulex
Posté le 29-06-2011 à 17:00:49  profilanswer
 


 
merci de vos reponses,
 
@LeRiton, j'ai modifié mon code entre temps et je tourne maintenant avec ProcessBuilder, effectivement, c'est nettement mieux.
 
@Bidem, désolé je n'avais pas précisé mais deja avec le code précedent je récuperais déjà l'inputstream et je n'avais aucun retour.
 
EN REVANCHE ! je n'avais pas pensé a regarder le errorStream et effectivement ! l'erreur est bien la..  
 
merci à toi !  
 

n°2086004
dumoulex
Posté le 30-06-2011 à 08:54:03  profilanswer
 


 
je ne sais pas pourquoi, le umount annonce device is busy...
 
alors que je fais ceci :

Code :
  1. File repFichier = new File(Configuration.getProperty("global.cheminDisqueAmovible" ));
  2.  File[] disqueAmovibles = repFichier.listFiles();
  3.  for (int i=0 ; i<disqueAmovibles.length ; i++){
  4.   File fichierCache = disqueAmovibles[i];
  5.   if (fichierCache.isFile() && fichierCache.getName().equals(Configuration.getProperty("global.fichierCache" ))){
  6.    disqueAmovibles = null;
  7.    return repFichier;
  8.   }
  9.  }
  10.  disqueAmovibles = null;
  11.  repFichier = null;


 
j'utilise donc umount -l qui force le demontage.
 
merci pour le errorStream Bidem !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  execution de commande shell fonctionne une fois sur deux

 

Sujets relatifs
Commande awk pour extraire des blocs d'un fichier + regexp sur lignesscript shell classnotfoundexception avec le classpath defini
Formulaire PHP fonctionne avec FF pas avec IESuperposer deux fois deux images
Probleme d'execution de script bash[Commande R] anova
[Shell] lecture fichier configurationurgent: problème d'exécution d'aun programme
commande awk avec arguments en entréeExécution d'un prog java sous Unix
Plus de sujets relatifs à : execution de commande shell fonctionne une fois sur deux


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR