execution de commande shell fonctionne une fois sur deux

execution de commande shell fonctionne une fois sur deux - Java - Programmation

Marsh Posté le 29-06-2011 à 15:20:04    

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  

Reply

Marsh Posté le 29-06-2011 à 15:20:04   

Reply

Marsh Posté le 29-06-2011 à 16:04:25    

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
Reply

Marsh Posté le 29-06-2011 à 16:09:17    

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
Reply

Marsh Posté le 29-06-2011 à 17:00:49    


 
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 !  
 

Reply

Marsh Posté le 30-06-2011 à 08:54:03    


 
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 !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed