Stdin et stdout

albert40 Messages postés 56 Statut Membre -  
albert40 Messages postés 56 Statut Membre -
Bonjour,

Pour pouvoir utiliser la commande rvlc en script, (relative aux commandes de vlc), on m'a dit que cette commande lit ses instructions de stdin et fait le output en stdout.
Seulement voilà, j'avoue que je n'ai aucune idée sur ces deux trucs en linux, (fichiers, bibliothèque ...)
Si peut m'expliquer ce dont il s'agit.
Merci pour vos réponses et bonne journée

19 réponses

Résumé de la discussion

La problématique centrale est d'utiliser rvlc en script et de faire communiquer VLC via stdin et stdout, en s'appuyant sur les redirections et les sockets pour envoyer des commandes et recevoir des réponses. Concept clé, l'entrée standard et la sortie standard se manipulent comme des flux: /dev/stdin, /dev/stdout et /dev/stderr permettent leur redirection vers des fichiers, d'autres processus ou des sockets. Des solutions pratiques évoquées incluent les redirections classiques (stdout, stderr, stdin) et le piping, mais aussi l'utilisation de netcat avec des sockets Unix (--rc-unix) et l'adaptation du script. En pratique, il faut choisir la bonne version de netcat (OpenBSD) et adapter le script, car le comportement varie selon la distribution et le shell, notamment l'option -U pour les sockets.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Concrètement il s'agit d'un concept commun à la plupart des langages de programmation (c, shell, java...).

    Sous linux, contrairement à windows, ces concepts sont visibles dans ton arborescence :
    - /dev/stdout représente la sortie standard,
    - /dev/stderr représente la sortie d'erreur standard,
    - /dev/stdin représente l'entrée standard.

    Il s'agit donc de concept modélisés par des fichiers (certes un peu spéciaux, mais des fichiers). C'est quelque chose de classique sous linux, les fichiers peuvent modéliser des concepts en plus de modéliser des fichiers ou des dossiers. Ainsi la notion de fichiers est plus vaste sous linux que sous windows.
    http://www.mistra.fr/tutoriel-linux-types-fichiers.html

    Quand tu lances un processus, par exemple la commande :

    passwd


    ... qui permet de changer ton mot de passe, celle-ci te demande ton mot de passe.
    - Elle écrit ce message dans stdout (ce qui le fait apparaître dans la console).
    - Puis elle te demande de saisir ton ancien mot de passe. Celui-ci est lu sur stdin.
    - Ensuite elle te demande ton nouveau mot de passe (message écrit sur la sortie standard), en vue de le lire sur l'entrée standard...
    - Mais si tu te plantes à un moment (mot de passe incorrect, trivial etc...), un message d'erreur est écrit sur la sortie d'erreur standard (qui apparaît également sur la console, mais qui correspond bien à un autre flux).

    Souvent une commande utilise implicitement l'entrée et les deux sorties standards. Quand on veut lire ou écrire ailleurs, il faut faire une redirection, ce qui se fait en shell avec les opérateurs :
    - 1>, 1>> (redirection de la sortie standard), (s'écrivent aussi > et >>)
    - 2>, 2>> (redirection de la sortie d'erreur standard),
    - < (redirection de l'entrée standard)

    Exemple :

    Supposons que je fasse un fichier toto.txt contenant :

    mon_ancien_mot_de_passe 
    mon_nouveau_mot_de_passe 
    mon_nouveau_mot_de_passe


    ... je peux lancer :

    passwd < toto.txt 1> out.txt 2> err.txt


    Ma saisie sera lue dans toto.txt au lieu du clavier. Le résultat sera dispatché entre out.txt (ce qui se passe bien) et err.txt (les erreurs).

    D'ailleurs l'opérateur | qu'on voit sous linux n'est ni plus ni moins qu'une redirection d'un flux qui aurait du être écrit sur la sortie standard d'un processus P1 sur l'entrée d'un processus P2 (P1 | P2).

    Exemple :

    df -h 
    df -h | grep tmpfs


    Le processus grep ne laisse passer que les lignes qui sortent de df -h qui arrivent sur son entrée et qui contiennent tmpfs.

    Est-ce que c'est plus clair ?

    Bonne chance
    7
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    J'ai peut être un début de réponse à ton problème ;-))

    Depuis hier j'ai essayé pas mal de choses, fichier en entrée, pipe, fifo, tty, pts, etc. mais sans grand succès.

    A force d'écumer le web et les forums de vlc, j'ai fini par trouver les "sockets" (non pas des chaussettes ;-) ), qui combinés à la commande netcat font apparemment l'affaire.

    Donc dans un terminal tu lances ton 'rvlc" comme suit :

    rvlc --rc-unix=socket1
    ou
    vlc --intf rc --rc-unix=socket1

    Et dans un autre terminal tu tapes :

    echo 'add ton_fichier.flv' | nc -U socket1
    CTRL+C pour sortir

    Puis :

    echo 'info' | nc -U socket1
    CTRL+C pour sortir

    Voilà, il suffit maintenant de trouver comment enchainer ces commandes et/ou comment en sortir du moins pour les enchainer. En les lançant en arrière-plan ça devrait le faire...

    ;-))
    2
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Bon je me suis amusé...

      $ cat foo.sh     # Le script
      #! /bin/bash
      
      while read line
      do
      echo "${line}"
      sleep 5
      done < fich
      
      $ cat fich     # Le fichier de commande
      add never_say_no_to_panda.flv
      info
      stats
      info
      stats
      
      
      $ ./foo.sh | nc -U socket1     # La commande

      Bien sûr au-préalable il faut avoir lancé :
      vlc --intf rc --rc-unix=socket1

      Et c'est nickel, les infos arrivent toutes les 5 secondes ;-))
      0
    2. albert40 Messages postés 56 Statut Membre
       
      Bonsoir
      Merci à zipe31 pour l'aide précieuse qu'il m'a fournie.
      Si j'ai bien compris ton message, je dois lancer la commande
      vlc --intf rc --rc-unix=socket1
      dans un terminal
      puis exécuter le script que tu m'as écrit.
      C'est ça ??
      0
      1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > albert40 Messages postés 56 Statut Membre
         
        Si j'ai bien compris ton message, je dois lancer la commande
        vlc --intf rc --rc-unix=socket1
        dans un terminal

        Oui. Ou
        rvlc --rc-unix=socket1


        puis exécuter le script que tu m'as écrit.
        Oui. Mais aussi adapter le fichier qui est lu dans le script à tes besoins.
        Le script est à lancé comme suit :
        ./foo.sh | nc -U socket1

        La version de "netcat" (nc) doit être la version BSD avec l'option "-U", les version de base ou GNU n'ont pas ce paramètre ;-(
        0
      2. albert40 Messages postés 56 Statut Membre > albert40 Messages postés 56 Statut Membre
         
        Dois-je comprendre que ça marche pas sur ubuntu ou bien que je dois changer un paramètre quelquepart ??
        Autre chose, est-il possible avec cette méthode de rediriger le flux de sortie de la commande rvlc (via > ) ??
        Le nom du fichier script est bien foo.sh ??
        Est ce que je dois créer un fichier fich ??
        Merci pour votre aide
        0
      3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > albert40 Messages postés 56 Statut Membre
         
        Dois-je comprendre que ça marche pas sur ubuntu ou bien que je dois changer un paramètre quelquepart ??
        Si si ça doit marcher sur Ubuntu il n'y a pas de raison... la seule condition c'est d'avoir le paquet "netcat-openbsd" (ou similaire). Sur ma Mandriva c'était le paquet "netcat-traditional" qui était installé par défaut mais il n'avait pas l'option "-U" (pour l'usage des sockets) et il en est de même pour le paquet "netcat-gnu", donc à toi de chercher le bon paquet dans les dépôts d'Ubuntu...


        Autre chose, est-il possible avec cette méthode de rediriger le flux de sortie de la commande rvlc (via > ) ??
        Ça je ne sais pas. Il faut faire des test. Ce n'était pas non plus la condition de ta demande d'origine ;-\


        Le nom du fichier script est bien foo.sh ??
        Oui. Mais tu l'appelles comme tu veux, y compris en tant que fonction à l'intérieur d'un script, car si on se réfère à ta demande initiale, tu voulais une fonction dans un script existant. Par contre le script est à adapter à tes besoins, là je n'ai donné qu'un exemple pour illustrer la méthode et qui colle un peu à ta demande.


        Est ce que je dois créer un fichier fich ??
        Pas nécessairement, tu peux utiliser les redirections d'entrée depuis une variable (<<<${variable}). Par contre le fichier ou la variable devra contenir les commandes à envoyer au travers du socket...


        Édit : Je viens de faire un test pour la redirection dans un fichier et apparemment ça marche :
         ./foo.sh | nc -U socket1 | tee -a fichier.log

        Édit² : netcat-openbsd pour Ubuntu Oneiric
        (This package contains the OpenBSD rewrite of netcat, including support for IPv6, proxies, and Unix sockets.)
        0
  3. albert40 Messages postés 56 Statut Membre
     
    Bonsoir
    Tout d'abord merci pour cette longue explication ça a été vraiment très enrichissant.
    Personnellement j'ai demandé des informations à propos de stdin et stdout car je veux utiliser les utliser dans un script basé sur la commande rvlc. Cette commande, issue du logiciel VLC (le célèbre) permet d'afficher sur console des informations pertinentes à propos du flux que vlc est entrain de lire. Pour la direction du flux de sortie ça a bien marché: quand je "pointe" la sortie vers un fichier texte j'obtiens mes informations sur ce fichier. Le problème qui persiste encore est l'entrée.
    D'abord, un premier problème est que rvlc considère EOF comme la commande shutdown. Et donc lorsque j'ai orienté le flux d'entrée vers un fichier input qui contenait la commande help. La sortie était le résultat de cette fonction et la sortie (non désirée) du menu de rvlc.
    D'un autre coté, au fait ce que je veux faire dans mon programme c'est de taper périodiquement la commande info dans rvlc.
    Et là j'avoue que je ne sais pas comment m'y prendre.
    Si quelqu'un peut m'aider sur ce point
    0
  4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Pour la direction du flux de sortie ça a bien marché: quand je "pointe" la sortie vers un fichier texte j'obtiens mes informations sur ce fichier. Le problème qui persiste encore est l'entrée.

    Ok

    D'abord, un premier problème est que rvlc considère EOF comme la commande shutdown. Et donc lorsque j'ai orienté le flux d'entrée vers un fichier input qui contenait la commande help. La sortie était le résultat de cette fonction et la sortie (non désirée) du menu de rvlc.

    Ok je vois... En fait c'est assez normal comme comportement. La commande rvlc exécute les commandes qu'elle reçoit en paramètre. Quand elle n'en a plus elle considère qu'elle a fait ce qu'elle devait faire et quitte en partant du principe que dans ton script, tu veux enchaîner avec d'autres commandes shell.

    En d'autres terme il ne faut pas chercher à aller à l'encontre du comportement de rvlc sur EOF car il est normal.

    D'un autre coté, au fait ce que je veux faire dans mon programme c'est de taper périodiquement la commande info dans rvlc.
    Et là j'avoue que je ne sais pas comment m'y prendre.
    Si quelqu'un peut m'aider sur ce point


    Il y a plusieurs écoles.

    1) Dans ton cas tu peux écrire une boucle en shell avec un sleep qui attendra entre deux collectes de points.

    # 10 jobs toutes les 2 secondes 
    for i in $(seq 1 10) 
    do 
      echo "job " $i 
      # ici tu appelles ta commande rvlc
      sleep 2 
    done 
    


    On peut imaginer faire une boucle infinie en réécrivant la boucle par exemple avec un while (cf tutoriel bash).

    2) Autre solution tu utilises cron pour planifier ton job avec une période donnée. Lis ces trois articles au préalable :
    http://doc.ubuntu-fr.org/cron
    http://doc.ubuntu-fr.org/anacron
    http://doc.ubuntu-fr.org/fcron

    Bonne chance
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. albert40 Messages postés 56 Statut Membre
     
    Ok je vois bien maintenant le comportement de rvlc et d'ailleurs ça ne pose plus problème qu'il sort du programme après.
    La seule difficulté qui me reste c'est de créer la boucle.
    La difficulté vient du fait que je ne dois pas seulement entrer la commande rvlc toute seule,
    mais plutôt la commande rvlc, suivie d'une commande add /nom/du/flux ; suivie de info ; (et suivie notamment de shutdown ou quit)
    et ça j'avoue que je ne sais pas comment m'y prendre car d'un coté :
    1-si j'écris les commandes add, info dans un fichier input (dans deux lignes distinctes) lui considère le tout comme une seule commande et donc renvoie un message d'erreur et se ferme
    2- Si j'essaie d'utiliser n'importe quel outil de planification de commandes disponible dans le terminal, je ne sais pas où insérer les "sous-commandes" que je veux exécuter après avoir lance rvlc (add, info ..)
    Si vous pouvez m'aider sur ce point précis
    0
  7. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Ok je vois bien maintenant le comportement de rvlc et d'ailleurs ça ne pose plus problème qu'il sort du programme après.

    Je pense même que tu as compris que ce n'était pas un "problème" mais le comportement que rvlc était sensé avoir ;-)

    La seule difficulté qui me reste c'est de créer la boucle.[...]

    1) Il suffit d'invoquer rvlc en plusieurs temps et de regarder son code d'exécution. Tout programme renvoie un code d'exécution, par convention 0 quand tout va bien et une valeur entière non nulle sinon (qui permet de retrouver dans le man la cause de l'erreur). Ton shell stocke le résultat de la dernière commande dans la variable $?.

    Exemple :

    (mando@aldur) (~) $ touch toto.txt
    (mando@aldur) (~) $ echo $?
    0
    (mando@aldur) (~) $ rm toto.txt 
    (mando@aldur) (~) $ echo $?
    0
    (mando@aldur) (~) $ rm toto.txt 
    rm: impossible de supprimer « toto.txt »: Aucun fichier ou dossier de ce type
    (mando@aldur) (~) $ echo $?
    1
    


    Il suffit de faire pareil avec rvlc. Concrètement le test en shell s'écrira :

    #!/bin/sh
    
    rvlc ....
    if [ $? -neq 0 ]
    then
      echo "La dernière commande a échoué" 1>&2
      # La valeur derrière exit correspond au code d'exécution
      # de notre programme. On quitte !
      exit 1
    fi
    
    # Fin du programme, tout va bien on quitte
    exit 0


    2) Dans un outil cron tu peux invoquer un script shell créé par tes soins et qui contiendra toutes les instructions que tu veux. Il n'y a donc pas de réelles contraintes non plus avec cette méthode.

    Bonne chance
    0
  8. albert40 Messages postés 56 Statut Membre
     
    Bonjour
    Pour la méthode utilisant Cron vous avez dit qu'il n'y a pas de réelles contraintes,; au fait ce qui m'intrigue c'est comment écrire dans le shell les "sous commandes" de rvlc (à savoir add /nom/du/fichier et la commande info)
    Apparemment je ne peux pas rediriger l'entrée vers un fichier input les contenant.
    Si vous avez une idée comment écire ce script
    0
  9. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Méthode 1 : en injectant un fichier avec l'opérateur shell "<"

    ma_commande < un_fichier_qui_contient_ce_que_j_aurais_tapé


    Exemple :

    On écrit dans fichier.txt

    toto   
    tata   
    titi


    ... puis on lance :

    grep "toto" < fichier.txt


    (la grep "toto" ne laisse passer que les lignes contenant toto reçues qu'elle reçoit en entrée).

    Je rappelle au passage que la capacité d'une commande à traiter /dev/stdin permet de l'utiliser dans un pipe (|), et c'est pour ça qu'on peut écrire par exemple :

    cat fichier.txt | grep "toto"


    Ceci signifie que pour chaque ligne du flux engendré par cat (qui va sortir de cat et entrer dans grep), grep ne laisse passer que les les lignes contenant la sous chaîne toto.

    Méthode 2 : à la volée avec l'opérateur shell "<<"

    ma_commande << EOF   
    ce_que_j_aurais_tape1   
    ce_que_j_aurais_tape2   
    ce_que_j_aurais_tape3   
    EOF


    Exemple :

    grep "toto" << EOF   
    tata   
    toto   
    titi   
    EOF


    Bonne chance
    0
  10. albert40 Messages postés 56 Statut Membre
     
    Bonsoir
    Malheureusement aucune ce des méthodes ne semble marcher pour le rvlc quand je mets plus d'une commande : soit dans le fichier input, soit à la volée avec l'opérateur shell.
    Voilà la sortie que je récupère quand je mets un fichier input contenant deux commandes
    par exemple si mon fichier input contient :
    help
    description

    Je récuprère le message d'erreur suivant :
    Error in 'help
    description' libvlc's "help
    description" is not a command
    Unknown command 'help
    description'. Type 'help' for help.
    

    De même quand je tape
    rvlc <<EOF
    help
    description
    EOF

    J'obtiens l'erreur suivante:
     Error in 'help
    description' libvlc's "help
    description" is not a command
    Unknown command 'help
    description'. Type 'help' for help.
    

    A vrai dire ce qui m'irrite dans ce cas c'est que je n'ai besoin de faire entrer au rvlc que deux commandes. Et là je ne comprends même pas son fonctionnement vis-à-vis de la redirection de l'entrée.
    J'ai aussi essayé de séparer les deux lignes par des caractères spéciaux: ";" "&&", ...
    rien ne marche : il prend toujours tout le fichier comme une seule entrée.
    Vous avez une solution à ce problème s'il vous plaît ??
    0
  11. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Ah mais attends j'ai peut être mélangé deux fils de discussion. Comment fais-tu pour passer des instructions à rvlc, pour moi rvlc se comportait comme une sorte de pseudo environnement dans lequel tu tapais des instructions (comme ftp, mysql etc...). Je cite :

    mais plutôt la commande rvlc, suivie d'une commande add /nom/du/flux ; suivie de info ; (et suivie notamment de shutdown ou quit)

    Du coup que tapes-tu exactement dans ton terminal pour le moment pour faire ceci ?
    0
  12. albert40 Messages postés 56 Statut Membre
     
    Pour faire ceci voilà ce que je fais :
    Premièrement je tape rvlc dans la console et on m'affiche ceci :
    VLC media player 1.1.4 The Luggage (revision exported)
    Blocked: call to unsetenv("DBUS_ACTIVATION_ADDRESS")
    Blocked: call to unsetenv("DBUS_ACTIVATION_BUS_TYPE")
    [0xa0b597c] [rc] lua interface: Listening on host "*console".
    VLC media player 1.1.4 The Luggage
    Interface de commande à distance initialisée, tapez « help » pour obtenir de l'aide.
    

    Puis on me donne la main pour entrer une commande. Je tape après
    > add /home/assia/Téléchargements/Going.flv
    
    (remarque : il y a le symbole >)
    Et on m'affiche ceci
    > [flv @ 0xa0ef770]Estimating duration from bitrate, this may be inaccurate
    [flv @ 0xb7215090]Estimating duration from bitrate, this may be inaccurate
    

    Puis on me donne la main pour taper une autre commande. Là je tape
    info
    (ici il y a pas de symbole >)
    Puis on m'affiche les infos:
    +----[ Flux 0 ]
    |
    | Type : Vidéo
    | Débit d'images : 25
    | Résolution : 640x480
    | Codec : H264 - MPEG-4 AVC (part 10) (avc1)
    |
    +----[ Flux 1 ]
    |
    | Type : Audio
    | Fréquence d'échantillonnage: 44100 Hz
    | Canaux : Stéréo
    | Codec : MPEG AAC Audio (mp4a)
    |
    +----[ end of stream info ]
    

    Voilà en gros ce que je fais dans la console et ce que je faire dans un script.
    Une dernière question, puisque la redirection du flux d'entrée ne semble pas marcher je pense à utiliser un simulateur de clavier (xdotool ou autre). A votre avis est ce que ça pourrait marcher ??
    Merci pour votre aide
    0
  13. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Ben normalement tu mets :

    add /home/assia/Téléchargements/Going.flv
    info


    dans par exemple /home/assia/rvlc.txt et normalement ensuite :

    rvlc < /home/assia/rvlc.txt


    Tu peux essayer ceci aussi (ça peut marcher si rvlc est codé sur le même principe que grep) :

    cat /home/assia/rvlc.txt | rvlc


    Bonne chance
    0
  14. albert40 Messages postés 56 Statut Membre
     
    Bonjour
    pour la première méthode voilà ce que j'obtiens comme résultat : (je ne vais copier que l'erreur)
    > [0x8c6be3c] filesystem access error: cannot open file /home/assia/Téléchargements/Going.flv
    info (No such file or directory)
    [0x8c6be3c] main access error: La lecture du fichier a échoué 
    [0x8c6be3c] main access error: VLC n'a pas pu ouvrir le fichier « /home/assia/Téléchargements/Going.flv
    info ».
    

    Sinon pour la deuxième que vous m'avez proposée voilà la sortie que je récupère :
    VLC media player 1.1.4 The Luggage (revision exported)
    Blocked: call to unsetenv("DBUS_ACTIVATION_ADDRESS")
    Blocked: call to unsetenv("DBUS_ACTIVATION_BUS_TYPE")
    [0x9f5a7e4] [rc] lua interface: Listening on host "*console".
    VLC media player 1.1.4 The Luggage
    Interface de commande à distance initialisée, tapez « help » pour obtenir de l'aide.
    > 
    

    Le fonctionnement est tel que je n'ai fait que taper rvlc.
    Sauf que tout ce que je tape (après > ) n'est pas pris en considération par rvlc.
    0
  15. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bah c'est bien la première méthode qu'il faut utiliser. Et si elle plante c'est que le fichier /home/assia/Téléchargements/Going.flv n'existe pas apparemment...
    0
  16. albert40 Messages postés 56 Statut Membre
     
    Non non c'est pas que le fichier n'existe pas. C'est que rvlc lit TOUT ce qu'il y a dans le input comme une seule commande.
    C'est comme ça que le rvlc marche (malheureusement). On ne peut que lui faire entrer les commandes une par une.
    Actuellement je pense que malheureusement la réalisation d'un script utilisant rvlc n'est pas possible avec deux commandes. J'essaie de chercher dans d'autres pistes, comme par exemple l'utilisation des simulateurs de clavier ou bien chercher les informations que je veux via d'autres moyens: méta données d'un flux dvbs.
    Si vous pouvez m'aider dans ces deux points.
    0
  17. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    À ce moment là invoque plusieurs fois rvlc avec dans fichier1...fichiern la bonne commande ?

    for i in $(seq 1 10)
    do
      #invoque rvlc < fichier1, ... rvlc < fichier10
      rvlc < fichier$i
    done


    Non ?
    0
  18. albert40 Messages postés 56 Statut Membre
     
    Bonjour zipe31
    Au fait je viens de réinstaller le paquet netcat-openbsd mais malheureusement je n'arrive toujours pas à activer l'option -U. Quelle manoeuvre supplémentaire pour l'activer ??
    Edit 1 : Je viens de tester ces deux "premières" commandes dans deux terminals :
    rvlc --rc-unix=socket1

    echo 'help' | nc -U socket1

    et ça ne marche pas malheureusement. (je pense que le résultat attendu est d'écrire help dans la première console)
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Il n'y a rien à activer, juste l'utiliser sur la ligne de commande.

      Que te renvoie la commande :

      nc --help
      0
    2. albert40 Messages postés 56 Statut Membre
       
      voilà ce qu'elle me renvoie:
      nc: invalid option -- '-'
      usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
            [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
            [-x proxy_address[:port]] [hostname] [port[s]]
      
      0
    3. albert40 Messages postés 56 Statut Membre
       
      Edit : et voilà ce que j'obtiens en utilisant la commande
      nc -U
      tout court :
      usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
            [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
            [-x proxy_address[:port]] [hostname] [port[s]]
      

      Je dois faire quoi pour activer cette commande ??
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      usage: nc [-46DdhklnrSt U uvzC] [-i interval] [-P proxy_username] [-p source_port]

      L'option existe.

      Je dois faire quoi pour activer cette commande ??
      Sûrement créer le socket avant.

      Il faut lancer la commande "rvlc --rc-unix=socket1" ou "socket1" est le nom qu'on donne au socket qui sera créé pour l'occasion.
      Ensuite dans un autre terminal et depuis le répertoire où a été lancée la commande précédente, lancer le script au travers du "pipe" avec la référence au socket...

      Donc dans un terminal :

      rvlc --rc-unix=socket1

      Puis dans un autre :

      cd /le_même/répertoire
      ./foo.sh | nc -U socket1
      0
    5. albert40 Messages postés 56 Statut Membre
       
      Tout d'abord merci pour la réponse.
      Au fait ce que je fais actuellement c'est créer le socket1 (depuis le dossier personnel) et dans un autre terminal je lande la commande
      echo 'help'  | nc -U socket1
      (toujours depuis le dossier personnel).
      Si j'ai bien compris normalement ça doit écrire help dans le premier terminal; mais malheureusement ce n'est pas le cas.
      Pouvez-vous m'aider sur ce point ??
      0
  19. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Petite démonstration en direct live ;-))

    En italique les commentaires
    En gras les commandes
    En normal l'affichage

    # listing du répertoire (la vidéo, le script et le fichier de commandes) 
    $ ls 
    fich  foo.sh*  never_say_no_to_panda.flv 
    
    # le contenu du script 
    $ cat foo.sh  
    #! /bin/bash 
    
    while read line 
    do 
    echo "${line}" 
    sleep 5 
    done < fich 
    
    # le contenu du fichier de commandes 
    $ cat fich  
    add never_say_no_to_panda.flv 
    info 
    stats 
    quit 
    
    # je lance vlc en mode remote command avec un socket et en arrière-plan (&) 
    ## dans le but de rester sur le même terminal 
    $ vlc --intf rc --rc-unix=socket1 & 
    [1] 5027 
    
    # donc on voit bien le "job" qui a été créé ([1] 5027) 
    $ VLC media player 1.0.6 Goldeneye
    Interface de commande à distance initialisée, « h » pour obtenir de l'aide. 
    
    # listing du répertoire avec le socket en plus (socket1=) 
    $ ls 
    fich  foo.sh*  never_say_no_to_panda.flv  socket1= 
    
    # je lance le script en demandant l'affichage à l'écran en même temps  
    ## que la redirection dans un fichier de log (fichier.log) 
    $ ./foo.sh | nc -U socket1 | tee -a fichier.log 
    Trying to add never_say_no_to_panda.flv to playlist. 
    add: returned 0 (no error) 
    status change: ( new input: never_say_no_to_panda.flv ) 
    status change: ( audio volume: 256 ) 
    status change: ( play state: 3 ) 
    +----[ Flux 1 ] 
    |  
    | Type : Audio 
    | Codec : mp4a 
    | Canaux : Stéréo 
    | Fréquence déchantillonnage: 44100 Hz 
    | Extension AAC: SBR 
    |  
    +----[ Flux 0 ] 
    |  
    | Type : Vidéo 
    | Codec : h264 
    | Résolution : 426x320 
    | Résolution daffichage : 426x320 
    | Débit dimages : 30 
    |  
    +----[ end of stream info ] 
    +----[ begin of statistical info ] 
    +-[Entrée] 
    | octets lus en entrée :      304 kO 
    | débit en entrée      :    269 kO/s 
    | octets lus en demux  :      286 kO 
    | debit en demux       :    318 kO/s 
    | 
    +-[Décodage vidéo] 
    | vidéo décodée        :   114 
    | trames affichées     :   129 
    | trames perdues       :     0 
    | 
    +-[Décodage audio] 
    | audio décodé         :   164 
    | buffers joués        :   164 
    | buffers perdus       :     0 
    | 
    +-[Diffusion] 
    | paquets envoyés      :     0 
    | octets envoyés       :        0 kO 
    | débit émission       :      0 kO/s 
    | 
    +----[ end of statistical info ] 
    stats: returned 0 (no error) 
    quit: returned 0 (no error) 
    status change: ( stop state: 0 ) 
    status change: ( stop state: 0 ) 
    status change: ( quit ) 
    [1]+  Done                    vlc --intf rc --rc-unix=socket1 
    
    # le script s'est achevé, les commandes ont bien été transmises y compris 
    ## la commande d'arrêt (quit) qui a pour effet de mettre un terme au job et  
    ### donc d'arrêter la vidéo 
    #### nouveau listing du répertoire. Le socket n'est plus là mais le fichier de log oui. 
    $ ls 
    fich  fichier.log  foo.sh*  never_say_no_to_panda.flv 
    
    # contenu du fichier de log 
    $ cat fichier.log  
    Trying to add never_say_no_to_panda.flv to playlist. 
    add: returned 0 (no error) 
    status change: ( new input: never_say_no_to_panda.flv ) 
    status change: ( audio volume: 256 ) 
    status change: ( play state: 3 ) 
    +----[ Flux 1 ] 
    |  
    | Type : Audio 
    | Codec : mp4a 
    | Canaux : Stéréo 
    | Fréquence déchantillonnage: 44100 Hz 
    | Extension AAC: SBR 
    |  
    +----[ Flux 0 ] 
    |  
    | Type : Vidéo 
    | Codec : h264 
    | Résolution : 426x320 
    | Résolution daffichage : 426x320 
    | Débit dimages : 30 
    |  
    +----[ end of stream info ] 
    +----[ begin of statistical info ] 
    +-[Entrée] 
    | octets lus en entrée :      304 kO 
    | débit en entrée      :    269 kO/s 
    | octets lus en demux  :      286 kO 
    | debit en demux       :    318 kO/s 
    | 
    +-[Décodage vidéo] 
    | vidéo décodée        :   114 
    | trames affichées     :   129 
    | trames perdues       :     0 
    | 
    +-[Décodage audio] 
    | audio décodé         :   164 
    | buffers joués        :   164 
    | buffers perdus       :     0 
    | 
    +-[Diffusion] 
    | paquets envoyés      :     0 
    | octets envoyés       :        0 kO 
    | débit émission       :      0 kO/s 
    | 
    +----[ end of statistical info ] 
    stats: returned 0 (no error) 
    quit: returned 0 (no error) 
    
    # vérification que le job s'est bien arrêté 
    $ jobs 
    $

    Zen my nuggets ;-)
    Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
    0
  20. albert40 Messages postés 56 Statut Membre
     
    Bonsoir
    J'ai essayé de reproduire un peu ce que vous avez fait dans le dernier message et malheureusement ça ne donne pas le même résultat :(
    # Premièrement le contenu du fichier :
    $ ls
    fich  foo.sh  Going.flv

    # Le contenu de fich
    $ cat fich
    add Going.flv 
    info 
    stats 
    quit
    

    # contenu du script
    $ cat foo.sh
    #! /bin/bash 
    
    while read line 
    do 
    echo "${line}" 
    sleep 5 
    done < fich 
    

    # Je lance rvlc en second plan via la commande que tu m'as donnée
    $ vlc --intf rc --rc-unix=socket1 &
    [1] 3728
    assia@assia-Aspire-one:~/scripting$ VLC media player 1.1.4 The Luggage (revision exported)
    Blocked: call to unsetenv("DBUS_ACTIVATION_ADDRESS")
    Blocked: call to unsetenv("DBUS_ACTIVATION_BUS_TYPE")
    [0x8c8cf44] [rc] lua interface: Listening on host "*console".
    VLC media player 1.1.4 The Luggage
    Interface de commande à distance initialisée, tapez « help » pour obtenir de l'aide.
    
    # je lance la commande pour exécuter le script
    $ ./foo.sh | nc -U socket1 | tee -a fichier.log
    Malheureusement je ne récupère rien dans la sortie :(
    Autre remarque: quand je tape ls comme vous l'avez fait pour voir le socket, ça ne marche que la première fois : si je lande ls une deuxième fois, le socket n'apparaît plus.
    Merci pour votre aide
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      # je lance la commande pour exécuter le script
      Avant regarde que le "socket" est bien créé.
      Est-ce que ton script est exécutable au moins ?

      si je lance ls une deuxième fois, le socket n'apparaît plus.
      Quand ? A partir d'où ?

      Avant de lancer la simulation comme je l'ai fait, essaye d'abord chaque partie individuellement pour voir si ça marche et au cas où ça bloque, essaie d'abord d'élucider chaque problème un par un avant de vouloir passer à la phase finale :-\

      Commence par les étapes de ce thread et si ça marche on avisera...
      0
    2. albert40 Messages postés 56 Statut Membre
       
      Bonjour
      J'ai commencé d'abord par ouvrir deux terminaux. Dans le premier terminal je tape :
      $ rvlc --rc-unix=socket1
      et je récupère la sortie suivante :
      VLC media player 1.1.4 The Luggage (revision exported)
      Blocked: call to unsetenv("DBUS_ACTIVATION_ADDRESS")
      Blocked: call to unsetenv("DBUS_ACTIVATION_BUS_TYPE")
      [0x87aca44] [rc] lua interface: Listening on host "*console".
      VLC media player 1.1.4 The Luggage
      Interface de commande à distance initialisée, tapez « help » pour obtenir de l'aide.
      

      Puis dans un autre terminal je tape la commande suivante :
      echo 'help' | nc -U socket1
      

      Là normalement je pense que je dois récupérer la commande help dans le premier terminal mais malheureusement ce n'est pas le cas.
      Sinon pour les deux terminaux je suis dans le dossier personnel pour les deux ??
      Que dois-je faire à votre avis ??
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Normalement l'aide devrait s'afficher dans le 2nd terminal, celui où a été lancée la commande " echo 'help' | nc -U socket1".

      Le socket est bien créé ?

      Après il y a ce message qui me dérange :
      Blocked: call to unsetenv("DBUS_ACTIVATION_ADDRESS")
      Blocked: call to unsetenv("DBUS_ACTIVATION_BUS_TYPE")
      [0x87aca44] [rc] lua interface: Listening on host "*console".

      Mais je ne sais qu'en penser, ni si c'est réellement bloquant ;-(

      Désolé mais là je ne sais plus quoi tenter ;-(
      0
    4. albert40 Messages postés 56 Statut Membre
       
      Ok une dernière petite remarque quand même :)
      la version de vlc que tu utilises est vlc 1.0.6
      Est ce que tu sais comment je peux me procurer cette version ??
      (apparemment c'est la seule différence qui peut être la cause ...)
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Je ne pense pas que la version soit un problème ;-\

      http://www.videolan.org/vlc/download-ubuntu.html

      Ubuntu Lucid Lynx 10.04 LTS
      
      VLC version 1.0.6 in Ubuntu 10.04 is out-of-date. We recommend you install VLC 1.1.x manually.
      
      If you wish to install VLC 1.0.6 anyway, please refer to the instructions above for Ubuntu 10.10. Note that there will be some bugs; you are on your own.
      
      At your OWN risks, install VLC from PPA:
      Command line way
      
          % sudo add-apt-repository ppa:lucid-bleed/ppa
          % sudo apt-get update
          % sudo apt-get install vlc vlc-plugin-pulse mozilla-plugin-vlc
      
      
      0