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

Langage Java Discussion :

Utilisation de Runtime.getRuntime().exec();


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Utilisation de Runtime.getRuntime().exec();
    Bonjour à tous !

    Je viens vers vous, suite à problème que je rencontre.

    Pour executer un script Perl j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process process = Runtime.getRuntime().exec(MaStringContenantMonScriptPerl);
    Mais je voudrais attendre la fin de l'exécution de ce script pour ensuite faire un move dessus, et bloquer le thread courant.

    J'ai essayé : Mais j'ai pas vraiment l'impression que ça marche.

    Sinon j'avais essayé l'API Shell de Adiguba, mais malheureusement celle-ci ne marche plus en JAVA 1.5.

    Si vous avec des idées de génies, je suis preneur

    Tutur

  2. #2
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    Mois je suis en 1.6 et l'api de Adiguba fonctionne très bien donc elle doit fonctionner aussi en 1.5.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Je vais re-essayer alors, mais déjà j'avoue des soucis depuis le passage en 1.5, et j'ai vu dans les commentaires de sa page où il explique son API, qu'il allait la faire compatible en 1.5 mais qu'elle ne l'était pas pour le moment (message datant de 2007 si mes souvenirs sont bons.).

    Merci en tout cas, et je vous tiens informé

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    qu'est-ce que tu appelle "faire un move dessus" ??

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Si tu utilises Runtime.getRuntime() il faut impérativement traiter les flux d'entrée/sortie.

    Quand à mon API, elle requiert Java 5.0 au minimum donc cela devrait être OK.

    Quel est le problème exactement ? Que ce soit avec Runtime ou avec mon API ?

    a++

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Mon fichier perl que j'exécute me renvoie un fichier sur lequel j'ai fait un traitement.

    Et je veux absolument attendre la fin de ce traitement avant de le changer de dossier. (Et le move doit-être fait en java, et non en Perl.).

    @Adiguba : Pour la gestion des flux d'entrée/sorties ça suffit ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
     
    BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
     
    // read the output from the command
     
    System.out.println(projectReference+" : Here is the standard output of the command:\n");
    while ((s = stdInput.readLine()) != null) {
            System.out.println(s);
    }
     
    // read any errors from the attempted command
     
    System.out.println(projectReference+" : Here is the standard error of the command (if any):\n");
    while ((s = stdError.readLine()) != null) {
    	System.out.println(s);
    }
    Ah oui j'ai inversé mon problème... Justement le serveur Unix sur lequel l'appli tournera n'est pas en Java 5.0 mais qu'en 1.4.2.02.

    Sinon ton API en local tournait vraiment bien et faisait parfaitement ce qu'on lui demandait. Beau boulot, mais malheureusement en entreprise, c'est jamais les versions les plus récentes que l'on a

    Merci de vos réponses.

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tutur50000 Voir le message
    @Adiguba : Pour la gestion des flux d'entrée/sorties ça suffit ça ?
    Non, car les flux doivent être géré en parallèles sous peine de conflit potentielle.

    Dans ce cas précis si ton script génère une erreur, il peut remplir le buffer stderr entre le script et l'appli java. Si tel est le cas ton script sera bloqué en écriture (en attendant qu'il y ait de la place pour pouvoir continuer à écrire). Or pour cela il faudrait que ton application Java lise le stderr du process... Mais ton code lit le stdout interblocage (les deux process s'attendent)

    De même il faut traiter le flux d'entrée (il suffit de le fermer si tu ne l'utilises pas), car sinon le script pourrait se retrouver bloquer en attente d'une saisie utilisateur...


    D'ailleurs au passage tu peux tout simplement de contenter de fermer tous ces flux si tu n'en a pas besoin (mais tu risque de perdre les messages associés).


    Bref dans ton cas cela devrait se rapprocher de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
            // close process stdin (unused)
            process.getOutputStream().close();
     
            // read the output from the command
            new Thread() {
                public void run() {
                    BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
                    try {
                        String s;
                        while ((s = stdInput.readLine()) != null) {
                                System.out.println(s);
                        }
                    } finally {
                        stdInput.close();
                    }
                }
            }.start();
     
     
            // read any errors from the attempted command
            BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            try {
                String s;
                while ((s = stdError.readLine()) != null) {
                        System.err.println(s);
                }
            } finally {
                stdError.close();
            }
     
     
            process.waitFor();
    Si tu es sûr que ton process ne génèrera aucune sortie utile, tu peux tout simplement fermer ces flux le plus tôt possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            Process process = ...
     
            // close process stdin/stdout/stderr (unused)
            process.getOutputStream().close();
            process.getInputStream().close();
            process.getErrorStream().close();
     
            process.waitFor();
    Citation Envoyé par tutur50000 Voir le message
    Ah oui j'ai inversé mon problème... Justement le serveur Unix sur lequel l'appli tournera n'est pas en Java 5.0 mais qu'en 1.4.2.02.
    Le problème c'est que Java 5 a apporté pas mal de nouveauté bien pratique qu'on ne retrouve pas dans le 1.4.2...



    Sinon quel est précisément le problème avec ton script : il ne s'exécute pas totalement où le waitFor() rend la main trop tôt ?
    De même quel est la ligne de commande de ton script passé à Runtime.exec() ?


    a++

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Ok, je comprends le risque d'interblocage, par contre le fait d'ajouter un thread va commencer à poser des problèmes, car je suis déjà en multi threading (environ une centaine de thread lancé en continue afin de surveiller les différents dossiers et traiter les fichiers dès qu'ils arrivent dedans.

    Mais je suis en effet entrain de me demander si ils me sont vraiment utile ses fameux flux... Est-ce que je peux juste savoir si la commande à l'intérieur de l'exec c'est correctement déroulé, ou ceci est impossible ?

    Si mon script Perl s'execute complètement. Mon problème vient du waitFor() qui rend la main trop vite, mais je vais essayer avec cette gestion des flux.

    La ligne de commande passée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl monscritPerl.pl arg0 arg1 ... arg9
    C'est sûr que je préférais ton consume()

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ce serait pas ton fichier pl qui ferait un fork ou un truc du genre. java attends biens, avec waitfor, que l'application lancée soit terminée, maintenant si cette même application lance des fils, on attends pas la fin des fils. Juste la fin du process dont on est responsable.


    maintenant, tu n'est pas obligé de faire des threads, tu peux aussi utiliser
    available() et read(byte[] b, int off, int len) sur les stream, et passer alternativement de l'un a l'autre, c'est juste plus chiant à programme

Discussions similaires

  1. [Système][Runtime]getRuntime().exec
    Par Neptune8 dans le forum API standards et tierces
    Réponses: 11
    Dernier message: 22/02/2011, 19h34
  2. Runtime.getRuntime().exec sous linux
    Par syl2095 dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 30/01/2007, 12h56
  3. Runtime.getRuntime().exec(String) méthode sort
    Par devAd dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2006, 13h53
  4. [Runtime.getRuntime().exec] ouvrir un fichier ??
    Par miloud dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 29/03/2006, 14h23
  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