Forum général.général appel aux spécialistes bash ...

Posté par  (site web personnel) .
Étiquettes : aucune
0
2
jan.
2006
J'aimerai faire un script bash, pour enregistrer un flux avec vlc pendant un certain laps de temps (ex 2min).

donc qqchose du style :

#!/bin/sh
vlc rtsp://... --sout "#std{access=file,mux=ts,url=$OUTFILE}" -I dummy &

sleep 120
exit 0


explications :
- vlc se lance dans un process (utilisation du &)
- le sleep va faire le process principale, et donc faire patienter vlc
- et l'exit va killer le script et vlc

Le problème : si je coupe/tue VLC .... le sleep va perdurer ...
j'aimerai bien que le "sleep" attende suivant 2 critères :
- le laps de temps défini
- ou la fin process VLC

je pense que c'est possible en bash, mais je ne sais pas trop par où débuter ...
  • # Peut-être une clownerie, mais...

    Posté par  . Évalué à 1.

    Pourquoi ne pas utiliser les opérateurs logiques ?
    Genre :
    vlc rtsp://... --sout "#std{access=file,mux=ts,url=$OUTFILE}" -I dummy & && sleep 120
    En espérant que ça aide...
    • [^] # Re: Peut-être une clownerie, mais...

      Posté par  . Évalué à 2.

      Ben non, ça aide pas mon truc... Ca ne fonctionne pas du tout, même... J'ai répondu trop vite, j'aurais du tester...
      A la rigueur, il faudrait encadrer l'appel à vlc ... & par des parenthèses, mais ça ne résoud pas le problème pour autant...
      Faudrait peut-être voir du côté des commandes pidof, at, kill.... A moins qu'il n'y ait plus simple...
  • # Essai

    Posté par  . Évalué à 1.

    Du genre
    (vlc || exit -1) & sleep 120; exit 0;
    My1.5ct
    • [^] # Re: Essai

      Posté par  (site web personnel) . Évalué à 5.

      j'aurais fait
      #!/bin/sh
      (vlc rtsp://... --sout "#std{access=file,mux=ts,url=$OUTFILE}" -I dummy; kill $$ )&
      sleep 120
      exit 0
      • [^] # Re: Essai

        Posté par  (site web personnel) . Évalué à 2.

        ça me paraît pas mal ...
        mais si je veux que du code s'execute après le sleep (par exemple : suppression d'un fichier) .... comment faire ?

        exemple :


        # creation d'un fichier
        echo "record en cours" > rec.txt

        vlc &
        sleep 120

        #suprresion du fichier precedemment cree
        rm rec.txt

        exit 0
        • [^] # Re: Essai

          Posté par  (site web personnel) . Évalué à 2.

          function sortir() { 
             rm -f rec.txt
             exit 0
          }
          
          trap sortir SIGTERM
          
          # creation d'un fichier
          echo "record en cours" > rec.txt
          
          (vlc; kill $$)&
          sleep 120
          sortir
          
          • [^] # Re: Essai

            Posté par  (site web personnel) . Évalué à 3.

            ok ... extra ... et une dernière demande ... si je veux stocker le PID du process VLC (pour pouvoir le tuer automatiquement d'ailleurs) en gros alors :
            function sortir() { 
               rm -f rec.txt
               exit 0
            }
            
            trap sortir SIGTERM
            
            # creation d'un fichier
            echo "record en cours" > rec.txt
            
            (
               vlc &
               pidvlc=$!
               echo $pidvlc > vlc.pid
               wait $pidvlc
               kill $$
            )&
            sleep 120
            sortir
            
            c'est crédible ?
            • [^] # Re: Essai

              Posté par  (site web personnel) . Évalué à 3.

              Oui ca parait bien a première vue, mais rien ne vaut un essai :)
              • [^] # Re: Essai

                Posté par  (site web personnel) . Évalué à 1.

                et ça ?
                function fin() { 
                   rm -f rec.txt
                   exit 0
                }
                
                # creation d'un fichier
                echo "record en cours" > rec.txt
                
                (
                   vlc &
                   pidvlc=$!
                   echo $pidvlc > vlc.pid
                   wait $pidvlc
                   fin
                )&
                sleep 120
                fin
                
                explications : - suppression du "trap" et du "kill $$" n'est pas mieux qu'avec le trap ?!
                • [^] # Re: Essai

                  Posté par  (site web personnel) . Évalué à 2.

                  Ben tu attendras toujours 120s même si vlc se finit avant...
                  C'est juste le fichier qui sera supprimé de suite, et le script essayera de le re-supprimer après la fin des 120s.
              • [^] # Re: Essai

                Posté par  (site web personnel) . Évalué à 2.

                j'ai fait un essai ;-)

                quand je recupere le pid de vlc (du fichier)
                et que je kill vlc (kill xxxx)
                le process vlc s'arrete
                le process du script s'arrete
                mais il reste toujours un process "sleep" ;-( ...

                pourquoi n'est il pas tué avec celui du script ? et y a t il une soluce ?
  • # Voir là...

    Posté par  (site web personnel) . Évalué à 1.

    Une solution a deja ete postee la :
    http://linuxfr.org/~11010010/20437.html
    Et un frontend python ici :
    http://forum.ubuntu-fr.org/viewtopic.php?pid=159297#p159297
    • [^] # Re: Voir là...

      Posté par  (site web personnel) . Évalué à 2.

      euhhh ... trop fort ...

      C'est MOI qui développe le frontend python sur TON script ;-)

      je cherche juste à améliorer ton script ... car le process "sleep" continue de tourner (ça fait pas beau ;-)
      Ce pourquoi je posais des questions ici pour faire avancer le schmilblick ...

      suis en train de préparer la 0.3 ;-)
      • [^] # Re: Voir là...

        Posté par  (site web personnel) . Évalué à 1.

        C'etait le mode d'emploi pour passer pour un rigolo ;)

        je me disais aussi que la ligne vlc ressemblait a qqch de connu...

        Une solution qui marche peut etre (pas testee...) :

        vlc .... &
        pidvlc=$!
        sleep .... &
        pidsleep=$!

        _trap_kill ()
        {
        trap "" KILL EXIT QUIT INT TERM
        echo killing $pidvlc
        kill $pidsleep
        kill $pidvlc
        sleep 3
        sync
        exit 0
        }
        trap _trap_kill KILL EXIT QUIT INT TERM

        wait $pidsleep
        • [^] # Re: Voir là...

          Posté par  (site web personnel) . Évalué à 2.

          en fait, je me suis "formé" à bash aujourd'hui ...
          et j'ai refait entièrement le script à partir de zero
          il est maintenant absolument parfait !!!
          - aucun process ne reste en mem (dans tous les cas)
          - un zenity/progress permet d'annuler le recording
          - et j'ai remonté l'appel au "AT" au niveau du python

          tu trouveras tout ici (dans la 04.b):
          http://manatlan.free.fr/setup/freecorder.tar.gz

          voir script "frecord.sh"
          • [^] # Re: Voir là...

            Posté par  (site web personnel) . Évalué à 1.

            Farpait !

            Juste un detail : le kill -9 est peut-etre un peu violent, je sais pas s'il va bien plaire a vlc. Ca serait peut-etre bien de faire un truc genre kill $pid ; sleep 3 ; kill -9 $pid 2> /dev/null pour lui laisser une chance de terminer proprement.

Suivre le flux des commentaires

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