2009-09-22 7 views
1

J'ai un script (script KSH pour être précis) qui télécharge 3 fichiers à partir d'un serveur FTP, en utilisant la commande curl.Comportement étrange lors de l'exécution d'un script bash à partir du programme Java

Lorsque j'exécute manuellement mon script, c'est-à-dire en exécutant la commande ./ftp_download.sh XXX (XXX sont les paramètres du script), le téléchargement se termine correctement.

Comme je veux exécuter le script à partir d'un programme Java, j'ai fait une classe courte Java qui contient exactement que:

public class Run { 

    private static final String CMD = "/.../sh/ftp_download.sh XXX"; 

    public static void main(String[] args) { 
     System.out.println("========================================================"); 
     BufferedReader out = null; 
     try { 
      long startTime = System.currentTimeMillis(); 
      String strOutputline; 
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
      Date now = new Date(); 
      Process processus = Runtime.getRuntime().exec(CMD); 
      out = new BufferedReader(new InputStreamReader(processus.getInputStream())); 
      while ((strOutputline = out.readLine()) != null) { 
       now.setTime(System.currentTimeMillis()); 
       System.out.println(sdf.format(now) + " " + strOutputline); 
      } 
      System.out.println("RESULT : " + processus.waitFor()); 
      out.close(); 
      processus.destroy(); 
      long duration = System.currentTimeMillis() - startTime; 
      System.out.println("Duration : " + duration); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (out != null) { 
        out.close(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     System.out.println("========================================================"); 
     System.out.println("END"); 
    } 

} 

Cependant, quand je lance ce programme simple, il gèle tout simplement après exactement 3m20 (Cette durée est toujours la même, même si j'exécute le programme Java plusieurs fois). par le gel, je veux dire que le programme Java est toujours en cours (le processus curl trop), mais le fichier téléchargé ne se développe pas plus (c.-à-curl ne continue pas à télécharger les données) ...

Ainsi, je ne me la ligne RESULT: xxx imprimé dans la console ...

Qu'est-ce qui peut expliquer ce comportement étrange? Ps: Dans un proche avenir, je vais changer mon projet afin de télécharger ces fichiers en utilisant la bibliothèque Apache commons-net, mais je veux vraiment comprendre ce comportement étrange!


Merci à derobert, je parviens enfin à résoudre ce problème. Quelques explications: en mode normal, curl affiche une information de progression (un tableau avec la quantité de données téléchargées, le temps restant, etc.). Après un certain temps, le tampon semble être complètement rempli, et c'est pourquoi le processus se fige ...

+0

Vous pouvez essayer strace sur le processus Java et voir où son attente/pendaison. – vpram86

+0

Mec, exécutant script bash à partir d'un programme Java * IS * un comportement étrange :) Désolé, n'a pas pu résister ... –

Répondre

13

Je ne suis pas une personne Java, mais plutôt une personne Unix, et une chose semble évidente: le tampon sur stdout ou stderr se remplit, puis curl bloque.

Cela fonctionne-t-il si vous exécutez curl en mode silencieux, comme dans curl --silent?

En consultant la documentation Java, il semble que vous souhaitiez également utiliser getErrorStream en plus de getInputStream.

+0

J'ai notifié que si je n'utilise pas l'attribut "-v" (verbose), je gagne environ 20 secondes avant que le processus ne gèle.Je vais essayer avec l'option "-s" (silencieux) ... – romaintaz

+0

+1 pour un excellent diagnostic – janko

+0

Le mode silencieux résout en effet mon problème! Merci beaucoup... – romaintaz

1

De Process:

Le processus parent utilise ces flux pour alimenter entrée et obtenir une sortie du sous-processus. Étant donné que certaines plates-formes natives fournissent uniquement une taille de mémoire tampon limitée pour les flux d'entrée et de sortie standard, l'échec de l'écriture rapide du flux d'entrée ou de la lecture du flux de sortie du sous-processus risque de provoquer le blocage.

Alors vous avez besoin pour obtenir le standard output et la error output du processus et de les lire jusqu'à ce qu'ils sont vides (à savoir le retour sur -1read()).

Questions connexes