2010-05-18 4 views
0

J'ai un execute (String cmd) dans un script jsp qui appelle la méthode exec de la classe Runtime.appel lynx à partir du script jsp

Cela fonctionne quand j'appelle une commande locale, comme un script php stocké sur le serveur. Par exemple:/usr/bin/php/chemin/vers/php/script arg1 arg2

Donc, je suppose que ma commande d'exécution est correcte, car elle fonctionne avec cela. Maintenant, lorsque j'essaie d'appeler lynx, le navigateur Web textuel, cela ne fonctionne pas.

Si je l'appelle dans un terminal, il fonctionne très bien: /usr/bin/lynx -dump -accept_all_cookies 'http://www.someurl.net/?arg1=1&arg2=2'

Mais quand j'appelle cela de mon exécuter la commande, rien ne se passe ...

Une idée pourquoi?

Ceci est ma méthode d'exécution:

public String execute(String cmd){ 


     Runtime r = Runtime.getRuntime(); 
     Process p = null; 
     String res = ""; 

     try { 
        p = r.exec(cmd); 
        InputStreamReader isr = new InputStreamReader(p.getInputStream()); 
        BufferedReader br = new BufferedReader(isr); 
        String line = null; 
        //out.println(res); 
        while ((line = br.readLine()) != null) { 

        res += line; 

        } 
        p.waitFor(); 
        } catch (Exception e) { 
        res += e; 
        } 
        System.out.println(p.exitValue()); 

     return res; 

    } 

Répondre

0

Je l'ai résolu .... en appelant le lynx dans un script php, script php que j'ai appelé à partir du script Jsp ...

C'est une solution merdique, mais au moins ça marche ... Je fais encore pas vraiment comprendre pourquoi la commande exec de Java fonctionne comme ça ...

Merci pour votre aide de toute façon Andrzej (tchèque je suppose du nom ..?^_ ^), en quelque sorte vous me mettre sur le chemin!

1

Vous devez lire à partir du flux de sortie Process '.

Comme vous ne l'êtes pas, le processus lynx sous-jacent est susceptible de bloquer lors de l'écriture en sortie, en attendant que quelqu'un vide le tampon du flux de sortie. Même si vous devez ignorer la sortie, vous devez quand même la lire pour que le processus s'exécute comme vous le souhaitez. Comme le javadocs of Process indique que «certaines plates-formes natives ne fournissent qu'une taille de 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 peut bloquer le impasse."

Voir http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html pour des exemples de la façon de gérer cela. Edit: au cas où vous vous demanderiez, il est probable que lorsque vous avez appelé le script PHP, il n'a pas produit beaucoup de sortie, et a donc pu se terminer avant de remplir le tampon de sortie et de bloquer. La commande lynx est probablement produire plus de sortie et donc frapper ce problème.

+0

hmm ok, alors pensez-vous que cela fonctionnera si je supprime simplement la lecture de la mémoire tampon et appelle simplement la méthode exec? Parce que je n'ai pas vraiment besoin de voir le résultat ... Je jetterai un oeil sur le lien que vous avez posté de toute façon, merci pour votre aide! – Piero

+0

Je pense que le tampon peut bloquer les deux extrémités, en fonction des implémentations internes de chaque côté. C'est probablement ce que les Javadocs veulent dire par "promptement". Je vais certainement essayer de se débarrasser de la mise en mémoire tampon, peut-être même remplacer le tout avec '(while in.read()! = -1) {}'? –

+0

il ne fonctionne toujours pas ...: -/ tout ce que je veux est d'appeler la commande:/usr/bin/lynx -dump -accept_all_cookies 'http://www.someurl.net/?arg1=1&arg2=2' d'un script jsp ... Pourquoi Java/Jsp est toujours si pointilleux sur des trucs stupides ... Je ne l'aimerai jamais! règles php! :-p – Piero

Questions connexes