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

Servlets/JSP Java Discussion :

Servlet avec Runtime.getRuntime().exec(. . .)


Sujet :

Servlets/JSP Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Servlet avec Runtime.getRuntime().exec(. . .)
    Bonjour,

    étant donné que c'est mon premier post ici je voudrais tout d'abord remercier l'ensemble des membres de ce forum, c'est une vraie mine d'or en de nombreux domaines.

    Je vais maintenant vous exposer mon problème ^^

    Je bosse sur une servlet qui appelle un programme au moyen d'une ligne du type suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process proc = Runtime.getRuntime().exec(...)
    À la base, l'argument de mon exec était la ligne de commande elle-même (à savoir ffmpeg (moteur de conversion vidéo) avec ses arguments), mais dans ce cas le processus de conversion ne démarrait pas si je ne fermais pas mon serveur web (Tomcat).

    J'ai réussi à passer outre ce problème en appelant ffmpeg indirectement, via un invite de commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process proc = Runtime.getRuntime().exec("cmd /c start "+...)
    Le problème est que je voudrais pouvoir traiter les éventuelles erreurs de ffmpeg, or (et selon toute logique), les différents accès qu'offre la classe Process (exitValue(), getInputStream()...) concernent l'exécutable "cmd", et non ffmpeg !

    Quelqu'un aurait-il une idée de comment je pourrais récupérer le code de retour et/ou la sortie standard (ou d'erreur) de ffmpeg dans ces conditions ?

    Merci de m'avoir lu. Cordialement,

    enzyme59

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Il te faut lancer directement ffmpeg. Une gestion correcte des flux te permettra de récupérer les erreurs. Va faire un tour dans la FAQ

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse. Effectivement grâce aux fonctions de la classe Process je pourrais récupérer les flux et traiter les erreurs...

    mon principal problème étant, je le répète, que si je lance directement ffmpeg avec mon Process, il ne démarrera pas si je ne ferme pas Tomcat (pour une raison que j'ignore). Mon projet devant à terme être publié sur la toile, tu imagines le malaise...

    Dans les deux cas, j'suis coincé une idée ? xD

  4. #4
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Je te conseille d'utiliser la librairie shell de notre cher Adiguba : http://blog.developpez.com/adiguba?t...es_plus_simple

    Dis moi ce que ca donne, notamment si tu arrives à lancer ta ligne de commande "normale"

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Wahoo, c'est proprement hallucinant !

    Cette API a l'air géniale ! J'essaye de suite et je te dis ce que ça donne.

    Merci pour le lien !

  6. #6
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Elle l'est effectivement (un petit slurp à Adiguba, d'ailleurs, j'utilise moi même l'API dans mon dernier projet).

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Ouaip, merci aussi à Adiguba pour cette API très bien pensée et plus qu'utile !

    Alors, résultat du premier test : je tente de lancer ma ligne de commande et d'en afficher ensuite le résultat sur ma page web (je rappelle que je suis en servlet) au moyen de la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    out.println(new Shell().command(...).consumeAsString());
    ffmpeg s'exécute très bien (adieu d'ailleurs à la fenêtre de cmd disgracieuse), mais rien ne s'affiche sur ma page par la suite. J'ai essayé de remplacer command par exec, mais j'ai alors une IOException : apparemment il faut bien séparer les paramètres entre eux, et lorsque je construis ma ligne de commande j'en fais une chaîne unique.

    Cela vaut-il le coup d'essayer pour pouvoir récupérer le résultat, ou bien ce problème vient-il d'ailleurs (sachant que j'ai placé l'exécutable de ffmpeg dans system32 et que donc, je peux l'appeler sans spécifier de chemin) ?

  8. #8
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    C'est étrange qu'avec command ca ne fonctionne pas. Tu sais pourquoi rien ne s'affiche sur ta page ? Tu pourrais détailler un peu ?
    Pour info, moi j'utilise command avec une commande qui a des paramètres directement tout dans une seule String sans aucun problème, et également en environnement web.

    Question : ton outil ffm donne la réponse en ligne de commande normalement ?

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Hé bien normalement, en tapant dans l'invite de commande ce que moi j'envoie en tant que String à mon command(...), ffmpeg écrit un vrai roman en détaillant chacune des étapes de son travail de conversion de la vidéo, oui.

    2ème test : j'ai essayé une ligne plus simple pour récupérer ce fameux roman dans un fichier texte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Shell().command(...+" > C:/video/log.txt");
    Rien ne se passe, j'en ai déduit que l'exécution était déclenchée par le fait de donner sa valeur à la chaîne de caractères.

    J'ai donc essayé de ruser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    out.println((new Shell().command(...+" > C:/video/log.txt")).consumeAsString());
    À l'heure où j'écris, il est en train d'encoder (les fichiers vidéos grossissent régulièrement), le fichier log.txt a été créé mais sa taille reste figée à 0 ko

    Y'a probablement un truc qui m'échappe...

  10. #10
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Tu ne peux pas utiliser le symbole ">" de redirection dans la ligne de commande ... Si tu veux écrire le résultat dans un fichier tu prends la String resultat de command et tu l'écris toi même dans le fichier ...

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Exact, j'avais mal pigé la doc de l'API

    Pourtant le shell apporte de nombreux avantages puisqu'il permet d'exécuter des commandes bien plus élaboré :

    * La gestion des redirections avec <, >, >>, 2>, 2>> et 2>&1.
    J'ai cru que cela voulait dire que l'API gérait ces symboles.

    Après relecture je vois grosso modo comment faire, je te tiens au courant.

    Merci pour ton aide.



    EDIT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ProcessConsumer pc = new Shell().command(cmdline);
    		pc.output(new FileOutputStream("C:/video/log.txt"));
    		pc.error(new FileOutputStream("C:/video/logerr.txt"));
    		pc.consume();
    Ce code fonctionne, en vérité ffmpeg écrit ses outputs sur la sortie d'erreur Le fichier logerr.txt contient tout ce dont j'ai besoin.

    Un grand merci !

    PS : Un dernier détail, est-il possible avec l'API de récupérer simplement le code de retour de l'exécution ?

  12. #12
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Ca je ne sais pas, je n'en ai jamais eu besoin ...

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Apparemment consume() retourne le code de reotur, donc tout va bien

    Quoi qu'il en soit, merci encore du temps que tu m'as consacré, et merci encore également à Adiguba pour cette API

  14. #14
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Pas de probleme ! N'oublie pas le tag

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

Discussions similaires

  1. Problème compilation avec Runtime.GetRunTime().exec(javac)
    Par Alkadabra dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 17/02/2010, 22h43
  2. Runtime.getRuntime().exec(command) à partir d'une servlet
    Par cotede2 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 04/05/2009, 16h26
  3. passer des arguments avec Runtime.getRuntime().exec;
    Par firgon dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 07/11/2008, 07h16
  4. runtime.getruntime.exec() avec envp
    Par babap1 dans le forum Langage
    Réponses: 2
    Dernier message: 17/07/2008, 11h19
  5. [Swing] execution avec Runtime.getRuntime().exec
    Par benssj5 dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 25/08/2004, 14h54

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