Forum Linux.général exposer un script comme un service

Posté par . Licence CC by-sa
Tags :
2
4
mar.
2014

Bonjour,

J'ai un programme - un scipt awk - qui lit l'entré standard ligne à ligne et qui produit une ligne de résultat par ligne.

$ echo "input" | monscript
output

Avant de pouvoir traiter la première ligne, le programme doit construire une structure de données à partir d'un fichier volumineux.
Cette construction prend environ 5s, contre qques ms ensuite pour le traitement d'une ligne, une recherche dichotomique dans la structure de données.

Ma problématique est la suivante: je voudrais transformer ce script en un service persistant tournant sur ma machine. Je pensais utiliser un pipe, voire une socket unix voire ip.

$ as_a_service monscript moyen_de_communication &
$ echo "input" | moyen_de_communication
output

J'ai fait quelques tests avec socat, sensé être magique, mais je n'ai pas pu aller au delà des exemples qui sont donnés et qui imposent de relancer le processus à chaque appel (option fork), ce qui ne solutionne pas mon problème. J'ai aussi essayé l'option "ingonreeof" mais cela ne fonctionne pas. Suis je sur une bonne piste ?

Merci de vos lumières

  • # (x)inetd pour socket IP ?

    Posté par . Évalué à 2.

    Le principe des programmes (x)inetd est d'attendre les inputs sur l'entrée standard, et de fournir la sortie sur la sortie standard.

    • [^] # Re: (x)inetd pour socket IP ?

      Posté par . Évalué à 2.

      est ce que cela fork des processus à chaque requête ?
      c'est cela qui me gênerai.

      sinon je crois que cela nécessite de passer par root, mais je peux m'en accommoder.

  • # mkfifo + tail -f ?

    Posté par . Évalué à 3.

    Cela pourrait peut-être faire l'affaire :

    mkfifo mafifo
    tail -f mafifo | monscript &
    
    echo "input" > mafifo
    echo "input2" > mafifo
    

    mkfifo permet de créer un tube nommé : ton moyen de communication.
    Le tail -f permet d'éviter la "fin de fichier" qui survient lorsque le echo ferme son côté du tube.

    Si tu veux vraiment en faire quelque chose qui ressemble plus à un service, nohup peut t'intéresser aussi pour le rendre insensible à une déconnexion du terminal.

    • [^] # Re: mkfifo + tail -f ?

      Posté par . Évalué à 2.

      Super, le "tail -f" ma manquait en effet pour ne pas avoir de fin de fichier.

      Me reste à trouver comment récupérer la réponse car pour l'instant elle part vers le tty où le script a été lancé.

      • [^] # Re: mkfifo + tail -f ?

        Posté par . Évalué à 3. Dernière modification le 05/03/14 à 11:37.

        bah pareil mais dans l'autre sens ?

        mkfifo monentree
        mkfifo masortie
        
        tail -f monentree | monscript.sh > masortie
        
        echo "testentrant" >monentree

        dans un autre terminal

        tail -f masortie

        • [^] # Re: mkfifo + tail -f ?

          Posté par . Évalué à 2.

          J'ai crié victoire trop vite.
          Il fini quand même par raccrocher.
          Je ne sais pas quel est le déclencheur.

          Pour la sortie vers un pipe, pareil, si le processus en écoute se termine, cela termine mon script.

          Galère…

          • [^] # Re: mkfifo + tail -f ?

            Posté par . Évalué à 1.

            c'est normal non ?

            tu veux faire un programme qui ne serait pas ouvert en permanence ? (c'est la definition d'un daemon ou d'un serveur).

            c'est quand meme toi qui ecrit le programme il me semble,
            donc à toi de faire qu'il ne s'arrete pas s'il n'a rien à lire, ou qu'il se relance à intervalle regulier.

            • [^] # Re: mkfifo + tail -f ?

              Posté par . Évalué à 2. Dernière modification le 05/03/14 à 20:31.

              donc à toi de faire qu'il ne s'arrete pas s'il n'a rien à lire, ou qu'il se relance à intervalle regulier.

              Non, justement, dans mon besoin, j'explique que je veux transformer un script qui lit stdin et écrit sur stdout en un service persistent (appelons le deamon).

              • [^] # Re: mkfifo + tail -f ?

                Posté par . Évalué à 2.

                un daemon, c'est un programme qui "attend"
                donc si ton script A n'attend pas,
                inclue le dans un script B qui attend, puis execute le script A

                il me semble que c'est le principe de (x)inetd
                qui ecoute un port reseau et ne lance le service qu'à l'arrivée d'un paquet sur le port ecouté

                • [^] # Re: mkfifo + tail -f ?

                  Posté par . Évalué à 2.

                  il me semble que c'est le principe de (x)inetd qui ecoute un port reseau et ne lance le service qu'à l'arrivée d'un paquet sur le port ecouté

                  C'est ce que j'ai répondu plus haut. Il faut par contre jouer avec ses options pour esperer que le service se comporte comme il le veut.

                • [^] # Re: mkfifo + tail -f ?

                  Posté par . Évalué à 2.

                  C'est déjà le cas : mon programme attend une ligne de stdin et produit une ligne en stdout, pui boucle.
                  Je vais creuser xinetd. Un peu lourd pour ce que je veux faire mais je n'y arrive pas avec socat donc il faut bien faire des concessions…
                  Merci pour ton aide en tout cas.

Suivre le flux des commentaires

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