Forum Linux.redhat Taille d'un argument passé en ligne de commande limité !

Posté par  .
Étiquettes : aucune
-1
4
mai
2010
Bonjour,

Je précise tout d'abord que je ne suis vraiment pas calé en linux

Je vous expose mon soucis:

J'ai un site PHP dans lequel je fais appel à la fonction exec() qui me permet d'appeler un exécutable java avec 5 arguments.

Or le problème est que parmi mes 5 arguments, il y en a un qui peut être une chaine très longue !

Or linux (et d'après ce que j'ai pu lire Windows aussi) limite apparemment la taille d'un argument à un nombre de caractères maximum.


Je ne savais pas ceci et c'est pour cela que des fois ça marchait et des fois non...

Pouvez-vous me donner un moyen de contourner ceci, d'augmenter par exemple pour tel argument la taille maximum autorisé


Un grand merci d'avance.
  • # fichier ou mémoire partagée

    Posté par  . Évalué à 2.

    classe mais plus compliqué à implémenter: La transmission par mémoire partagée:
    http://php.net/manual/en/book.sem.php
    http://bmsi.com/java/posix/
    http://bmsi.com/java/posix/posix-1.2.2/doc/index.html

    cradingue: Tu créé un fichier avec ton texte par exemple dans /tmp et tu passe son chemin en argument.

    Pour chaque personne qui me plussoie, je frappe un fan de Justin Bieber.

    • [^] # Re: fichier ou mémoire partagée

      Posté par  . Évalué à 5.

      Une solution entre les deux est d'utiliser un tube nommé.

      Envoyé depuis mon lapin.

    • [^] # Re: fichier ou mémoire partagée

      Posté par  . Évalué à 3.

      La transmission par memoire partagee c'est peut-etre classe, mais c'est dangereux.

      Typiquement : Tu commences a lire, et pendant que tu lis l'autre cote modifie --> boum

      Alors qu'avec le fichier, tu lock le fichier et c'est bon.
      • [^] # Re: fichier ou mémoire partagée

        Posté par  . Évalué à 5.

        Tu peut locker l'accès au segment de mémoire partagé avec un sémaphore.

        Pour chaque personne qui me plussoie, je frappe un fan de Justin Bieber.

        • [^] # Re: fichier ou mémoire partagée

          Posté par  . Évalué à 2.

          Ca marche uniquement si l'autre cote respecte cela et utilise le semaphore. Avec le fichier, t'as la garantie que personne ne viendra ecrire pendant que tu lis, peu importe qui a ecrit l'autre soft.
          • [^] # Re: fichier ou mémoire partagée

            Posté par  . Évalué à 2.

            C'est exact. Par contre, passer par un fichier signifie passer par le disque dur, qui est beaucoup plus lent que la ram, dans laquelle se situe le segment de mémoire partagée.

            Pour contrer ce problème, la solution proposée par yellowiscool permet d'utiliser un segment de ram comme si c'était un fichier. C'est surement le plus simple pour son utilisation, puisqu'il souhaite passer des caractères.

            Pour chaque personne qui me plussoie, je frappe un fan de Justin Bieber.

            • [^] # Re: fichier ou mémoire partagée

              Posté par  . Évalué à 3.

              C'est exact. Par contre, passer par un fichier signifie passer par le disque dur

              Pas forcément : le cache disque sera peut-être juste rempli le temps de passer les données d'un appli à l'autre, et le fichier ne sera peut-être jamais vraiment écrit sur le disque.
              • [^] # Re: fichier ou mémoire partagée

                Posté par  . Évalué à 3.

                C'est le "Pas forcément" qui change tout. Tu as une certaine probabilité que cela soit écrit, alors qu'en passant par la ram (d'une façon ou d'une autre), tu as la certitude qu'il n'y aura pas de lenteur induite par l'écriture/lecture sur le disque.

                Après, il est possible que la probabilité qu'il y ai passage par le disque soit faible, mais c'est un pari dont on peut se passer.

                Pour chaque personne qui me plussoie, je frappe un fan de Justin Bieber.

                • [^] # Re: fichier ou mémoire partagée

                  Posté par  . Évalué à 2.

                  en passant par la ram (d'une façon ou d'une autre), tu as la certitude qu'il n'y aura pas de lenteur induite par l'écriture/lecture sur le disque

                  tant que ça swap pas
                  • [^] # Re: fichier ou mémoire partagée

                    Posté par  . Évalué à 3.

                    Mais zut, j'étais sur d'avoir répondu hier, j'ai du oublier de poster.

                    Bon, je refais.

                    Deux cas: tu passes par un segment de ram partagé ou tube nommé, ça passera par la ram sauf si elle est pleine, auquel cas ça swap (disque dur).
                    Ou tu passe par un fichier, dans ce cas ça passera par le disque (modulo les systèmes de caches).
                    La première méthode sera plus rapide que la première, sauf en cas de swap, auquel cas elle sera aussi lente que la seconde, mais pas plus.

                    Donc, je ne vois pas l'avantage de la seconde méthode.

                    Pour chaque personne qui me plussoie, je frappe un fan de Justin Bieber.

                    • [^] # Re: fichier ou mémoire partagée

                      Posté par  . Évalué à 2.

                      en reformulant, il n'y aura pas de lenteur *supplémentaire* induite par l'écriture/lecture sur le disque, si je comprend bien ta mise au point.

                      je ne réagissais qu'à la phrase qui, en elle même, me paraissait incorrecte, mais sur le fond, je suis d'accord avec ton analyse.
  • # Des suites

    Posté par  . Évalué à 1.

    Merci pour vos réponses

    Finalement, je suis passé par un fichier...

    Mais malheureusement, y a encore un problème !

    En fait, c'est bizarre mais même en passant par un fichier, quand la chaine est trop longue ben la aussi ma fonction exec me plante !

    voici ma commande dans mon script PHP:

    Code :
    unset($res);
    exec ("java -Djava.endorsed.dirs=".PUBLIC_HTML_PATH."/java/ressource -jar ".PUBLIC_HTML_PATH."/java/executable.jar \"$completePathFileName\"", $res, $return_var);

    Et bien figurez-vous que malgré cela, lorsque mon argument est trop grand ça ne passe pas alors que ça passe lorsqu'il est moins long...

    D'ailleurs, $return_var renvoi 1 à ce moment là (alors que normalement, il me semble qu'il doit renvoyer 0 lorsque tout s'est bien déroulé)

    Any idea?
    • [^] # Re: Des suites

      Posté par  . Évalué à 1.

      bon j'ai des nouvelles


      J'ai testé l'exécution du .jar directement à partir de la console putty et la il semblerai que j'ai un problème dans mon exécutable java : Exception indexOutOfBoundsException index: 0, size: 0

      Donc pour essayé de débuggé ceci, j'ai bossé sur mon ordi en local pour être plus confort, avec eclipse et tout le toutime...

      J'ai bien sur repris le même fichier pour tester et la, BIZZARE: aucun bug!!!

      Plus d'Exception indexOutOfBoundsException !!!


      La ça devient vraiment chelou...


      Je remarque quelque chose, lorsque j'ai loué ce serveur chez OVH il y a un mois, il y avait une ancienne version de JAVA dessus (1.4) et mon programme nécessitait la version 1.6 pour être conforme...

      Donc, j'ai suivi les conseils de quelqu'un pour me mettre à jour (car je n'y connais rien en mise à jour sous linux) en tapant la commande:

      Code :

      yum install java-1.6.0-openjdk

      Et effectivement ça m'avait bien mis à jour et j'ai pu faire marcher mon exécutable.

      Or il me semble que le openjdk n'est pas exactement le même que le jre fournit par sun

      De plus chez moi en locale (là où il n'y a pas de bug), j'ai le JRE de Sun qui est installé...



      Pensez-vous que ceci explique cela et qu'il faut que je me mette à changer et passer à la JRE de sun? ou avez-vous une autre idée ?

      Merci


      [EDIT]
      je viens de voir que le bug que j'ai est reporté ici, dans la database des bugs de sun
      • [^] # Re: Des suites

        Posté par  . Évalué à 2.

        Si je comprend bien, tout marche bien que ce soit avec la version openjdk 1.6 ou avec la version sun 1.6?

        Le seul cas problématique est celui où tu es en 1.4?

        Pour chaque personne qui me plussoie, je frappe un fan de Justin Bieber.

  • # précisions

    Posté par  . Évalué à 1.

    Non non,

    ça marche chez moi en local avec le jdk de sun 1.6 mais sur mon serveur opendjdk 1.6 ça bug des fois...
    • [^] # Re: précisions

      Posté par  . Évalué à 2.

      openjdk n'est pas aussi mature que l'implémentation SUN. Si tu as des problèmes, passe donc à celle de sun, qui est l'implémentation de référence.

      Pour chaque personne qui me plussoie, je frappe un fan de Justin Bieber.

      • [^] # Re: précisions

        Posté par  . Évalué à 0.

        OK J'AI TROUVé!!

        C'était du au fait que dans mon applic java , y a un set time max au dela du quel si il ne trouve pas le calcul, il doit arreter...

        J'ai augmenter ce set time limit et ca marche!

        (mon serveur est plus lent que mon PC...)

        pfiou tout ca pr ca!!!

        Encore merci a vous :D
      • [^] # Re: précisions

        Posté par  . Évalué à 2.

        OK J'AI TROUVé!!

        C'était du au fait que dans mon applic java , y a un set time max au dela du quel si il ne trouve pas le calcul, il doit arreter...

        J'ai augmenter ce set time limit et ca marche!

        (mon serveur est plus lent que mon PC...)

        pfiou tout ca pr ca!!!

        Encore merci a vous :D
        • [^] # Re: précisions

          Posté par  . Évalué à 2.

          au plaisir ;)

          Pour chaque personne qui me plussoie, je frappe un fan de Justin Bieber.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.