Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lancer une commande dans un .jar lancé

Lancer une commande spécifique à l'application dans un script

Sujet résolu
Anonyme
    25 mai 2016 à 20:36:48

    Bonjour,

    Je vous explique mon problème:

    J'ai une application .jar que je lance depuis le terminal et je peux lancer des "commandes" spécifiques à l'application dedans (dans le terminal).

    J'aimerais automatiser ça dans un script mais les commandes que j'écris dans le script ne s’exécutent qu'après l'arrêt de l'application .jar .

    Est-ce possible de lancer des commandes faites pour l'application dans l'application avec un script sh?

    Ça ne m'a pas l'air très compatible ni possible à faire mais je pose quand même la question.(J'ai l'impression de mal m'exprimer, n'hésitez pas à me demander des précisions si vous ne comprenez pas)

    Merci d'avance pour les réponses.

    • Partager sur Facebook
    • Partager sur Twitter
      25 mai 2016 à 21:15:37

      Salut,

      Il y a différentes solutions, en voici quelques unes :

      Le plus simple ça peut être de mettre les commandes à exécuter en argument du programme (donc que tu récupère en argument de la méthode main).

      Après tu peux envoyer des commandes à ton application en utilisant stdin que du devra parser dans ton appli (exemple :  (echo "ditBonjour()"; echo "ditAurevoir()") | java -jar tonJar.jar, et dans ton application tu fais comme si c'était quelqu'un qui avait taper ces ordres sur la console.

      Tu peux aussi utiliser des named pipes ce qui peut être pratique si tu dois aussi consulter les réponses de ton application.

      Après tu peux aussi faire un serveur tcp dans ton appli java qui attend des commandes sur un port tcp et depuis ton script (si c'est un script bash), envoyer ces commandes en faisant des : echo "taCommande" > /dev/tcp/localhost/<Le port TCP de ton app>

      -
      Edité par macaque 25 mai 2016 à 21:17:55

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        26 mai 2016 à 17:10:57

        macaque a écrit:

        Salut,

        Il y a différentes solutions, en voici quelques unes :

        Le plus simple ça peut être de mettre les commandes à exécuter en argument du programme (donc que tu récupère en argument de la méthode main).

        Après tu peux envoyer des commandes à ton application en utilisant stdin que du devra parser dans ton appli (exemple :  (echo "ditBonjour()"; echo "ditAurevoir()") | java -jar tonJar.jar, et dans ton application tu fais comme si c'était quelqu'un qui avait taper ces ordres sur la console.

        Tu peux aussi utiliser des named pipes ce qui peut être pratique si tu dois aussi consulter les réponses de ton application.

        Après tu peux aussi faire un serveur tcp dans ton appli java qui attend des commandes sur un port tcp et depuis ton script (si c'est un script bash), envoyer ces commandes en faisant des : echo "taCommande" > /dev/tcp/localhost/<Le port TCP de ton app>

        -
        Edité par macaque il y a environ 19 heures

        D'après ce que je comprends, il faut modifier l'appli java. Or, mon appli ne m'appartient pas, je l'ai juste téléchargée et ce n'est pas moi qui l'ai faite. Y aurait il un autre moyen?(veuillez m'excuser si j'ai mal compris les solutions mais je suis encore débutant en linux.)

        Merci

        • Partager sur Facebook
        • Partager sur Twitter
          26 mai 2016 à 19:06:57

          Salut

          Quand tu lances ton application , tu n'est plus dans le shell mais dans la console fournit par ton programme . Donc regarde dans sa doc  pour voir s'il y a un fichier exécuté automatiquement à son démarrage où tu pourras mettre tes commandes .

          Et puis si tu pouvais préciser le nom de ce programme , ça peut aider ....

          A plus

          • Partager sur Facebook
          • Partager sur Twitter
            26 mai 2016 à 19:15:27

            Je plussoie cjd.

            Quelle est l'application, sous quel forme l'application attend elle les commandes ?

            J'ai crue comprendre de ton premier message que c'est une application en console (qui se lance dans le terminal) et qui récupère donc les commandes de stdin.

            Si c'est bien le cas tu peux utiliser jouer avec les flux stdin et stdout depuis ton script shell pour "communiquer" avec l'application.

            Sinon est-ce que le code ou les interfaces de l'application sont documentées ?

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              4 juin 2016 à 18:14:20

              Salut,

              L'application en question est un serveur du jeu vidéo Minecraft que vous connaissez peut-être :). On peut le télécharger et inviter des joueurs à le rejoindre en se connectant sur l'ip de l'ordi hôte. J'ai donc mon ordi hôte avec le serveur tout bien confiquré et tout.

              Ce jeu possède un tchat et je peux écrire des messages dedans grâce à la console du serveur (exemple en tapant "say blabla" dans la console, les joueurs voient s'afficher "blabla" dans le tchat). Mon but est de pouvoir afficher des messages régulièrement aux joueurs dans le tchat à l'aide d'un script .sh lancé depuis l'ordinateur hôte. C'est pourquoi je vous demande comment taper des "commandes" dans l'appli.

              Question documentation, je n'en ai pas trouvé à ce jour mais je vais chercher. Quand aux flux stdin et stdout, je ne sais pas ce que c'est! :(

              Ce problème ne me semble pas avoir de solution, donc si vous pensez qu'il est insolvable dites le moi et je passerai à autre chose sans vous importuner plus que ça :)

              Merci

              • Partager sur Facebook
              • Partager sur Twitter
                4 juin 2016 à 21:08:14

                Salut,

                Je ne connais pas le serveur du jeu vidéo Minecraft, je n'y ai jamais joué.

                Quand tu dis console, c'est une console à l'intérieur d'une interface graphique du jeux ou bien c'est un terminal dos ou unix ?

                Autrement dit, est-ce que le serveur est dans une interface graphique (gui) ou bien une interface en ligne de commande (cli) ?

                Si c'est une cli, on pourra reparler de stdin et stdout, sinon ce n'est pas la peine.

                Si c'est une gui, le plus accessible doit être de s'intéresser à des outils de simulations de clic/touche clavier (comme Actionaz que je n'ai jamais testé) ou de tests automatisés d'interfaces graphiques qui répondent au même besoin. Le principe étant alors d'enregistrer des scénarios d’interaction (clic souris et frappe au clavier) que ces applications doivent rejouer.

                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  5 juin 2016 à 11:47:55

                  Ce serveur est un peu spécial:

                  Lorsqu'on le lance sous windows, il ouvre un(une?) gui ou l'on peut taper des commandes. Sous linux, on peut lancer l'archive jar normalement(java -jar server.jar) et il nous ouvre un gui, ou bien on peut rajouter l'argument "nogui" et il nous ouvre, dans le terminal, quelque chose comme ça:

                  java -jar server.jar nogui
                  [11:33:53] [Server thread/INFO]: Starting minecraft server version 1.8.8
                  [11:33:53] [Server thread/INFO]: Loading properties
                  [11:33:53] [Server thread/INFO]: Default game type: SURVIVAL
                  [11:33:53] [Server thread/INFO]: Generating keypair
                  [11:33:54] [Server thread/INFO]: Starting Minecraft server on *:25565
                  Java HotSpot(TM) Server VM warning: You have loaded library /tmp/libnetty-transport-native-epoll8229717429849720572.so which might have disabled stack guard. The VM will try to fix the stack guard now.
                  It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
                  [11:33:54] [Server thread/INFO]: Using default channel type
                  [11:33:54] [Server thread/INFO]: Preparing level "world"
                  [11:33:55] [Server thread/INFO]: Preparing start region for level 0
                  [11:33:56] [Server thread/INFO]: Preparing spawn area: 43%
                  [11:33:57] [Server thread/INFO]: Preparing spawn area: 89%
                  [11:33:57] [Server thread/INFO]: Done (2,434s)! For help, type "help" or "?"
                  say hello
                  [11:36:01] [Server thread/INFO]: [Server] hello
                  
                  Tout ça s'affiche dans le terminal, et on peut voir que je peux taper des commandes dans le terminal(comme say hello). On voit le résultat dans le terminal également. Malgré que ce soit dans le terminal, si j'écris un petit script sh qui lance le serveur puis dit "say hello"(echo say hello), je ne vois le "say hello" qu'après l'arrêt du serveur(lorsque l'on tape stop, le serveur s'arrête):
                  [11:41:11] [Server thread/INFO]: Done (2,064s)! For help, type "help" or "?"
                  stop
                  [11:41:14] [Server thread/INFO]: Stopping the server
                  [11:41:14] [Server thread/INFO]: Stopping server
                  [11:41:14] [Server thread/INFO]: Saving players
                  [11:41:14] [Server thread/INFO]: Saving worlds
                  [11:41:14] [Server thread/INFO]: Saving chunks for level 'world'/Overworld
                  [11:41:14] [Server thread/INFO]: Saving chunks for level 'world'/Nether
                  [11:41:14] [Server thread/INFO]: Saving chunks for level 'world'/The End
                  [11:41:15] [Server Shutdown Thread/INFO]: Stopping server
                  [11:41:15] [Server Shutdown Thread/INFO]: Saving players
                  [11:41:15] [Server Shutdown Thread/INFO]: Saving worlds
                  [11:41:15] [Server Shutdown Thread/INFO]: Saving chunks for level 'world'/Overworld
                  say hello

                   Après ça je suis de retour dans le terminal normal.

                  Je pense donc que malgré qu'on voie les logs dans le terminal, l'appli s'exécute en dehors du terminal(si vous voyez ce que je veux dire).

                  Pour Actionaz, je garde ça en dernière solution, cela ne me paraît pas être une méthode propre.

                  -
                  Edité par Anonyme 5 juin 2016 à 11:50:46

                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 juin 2016 à 12:02:14

                    Ah, ba du coup si tu as une option "nogui", essaie la méthode que je disais dans mon premier post et lance cette commande :

                    (while true; do echo "hello"; sleep 5; done) | java -jar server.jar nogui




                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      24 juin 2016 à 21:11:51

                      Merci beaucoup, ça marche maintenant, et désolé pour cette réponse tardive...

                      Je ne sais pas si et comment on met le sujet comme résolu, pourriez-vous m'informer la dessus?

                      Encore merci pour la solution.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 juin 2016 à 8:46:41

                        Je ne suis pas sûr, mais je pense que si tu passe ta souris sur ton premier message, il doit apparaître un bouton pour marquer le sujet résolu.

                        Sinon ça doit être en haut à gauche vers les boutons "Partager" et "Actions".

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Lancer une commande dans un .jar lancé

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown