Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/07/2013, à 18:04

Compte supprimé

[Résolu] Bash exporter variable fils à son père

Bonjour la communauté, smile

Voici un extrait de script...

titres="1 2"

for i in $titres
      do
      vamps -e 1 -a 01 -s 02 < "/home/slyfox/Bureau/video-Titre-$i.vob"  > "/home/slyfox/Bureau/video-Titre-$i.mpg" &
      pid=$!
      echo "$pid" > /home/slyfox/Bureau/pid.txt

      while [[ ! -z "$(pidof vamps | grep "$pid")" ]]
      do
      pourcentZenity=$(commande calculant le pour-cent de la nouvelle vidéo copiée)
      echo "$pourcentZenity" #Renvoi cette valeur du pourcentage à la boite zenity 
      done

done |  zenity --progress --auto-close
             
if   [[ "${PIPESTATUS[1]}" != "0" ]] 
then 
pid=$(</home/slyfox/Bureau/pid.txt)
kill "$pid"
fi

Petite explication...

Vamps (programme qui permet de réduire une video) est lancé en arrière plan... je récupère son pid qui est utile pour tuer Vamps si je ferme la fenêtre zenity.
La boucle while me calcule le pourcentage de l'avancement de la nouvelle vidéo... que je renvoie à Zenity pour la barre de progression.

Ma question... La seule manière que j'ai trouvé pour récupérer la variable "pid" et de passer par un fichier... Il y a t’il une autre manière de procéder sans passer par un fichier pour récupérer la variable "pid" ???

Amicalement Slyfox

Dernière modification par Compte supprimé (Le 29/07/2013, à 22:56)

#2 Le 29/07/2013, à 10:01

tiramiseb

Re : [Résolu] Bash exporter variable fils à son père

Salut,

À ma connaissance, un processus fils ne peut pas "passer" une variable à son père.

Maintenant, ce que je ne comprends pas par rapport à ton script c'est que là tu es toujours dans le même script, il n'y a ni père ni fils...

Hors ligne

#3 Le 29/07/2013, à 12:04

Bigcake

Re : [Résolu] Bash exporter variable fils à son père

Bonjour

Je ne sait pas comment tu lance tout ton truc mais en faisant un 'echo $pid', et en utilisant une redirection '|' ou '<', dans la ligne de commande, est-ce que ça te conviendrai ?

Dernière modification par Bigcake (Le 29/07/2013, à 12:06)


"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#4 Le 29/07/2013, à 12:08

Compte supprimé

Re : [Résolu] Bash exporter variable fils à son père

tiramiseb a écrit :

Maintenant, ce que je ne comprends pas par rapport à ton script c'est que là tu es toujours dans le même script, il n'y a ni père ni fils...

euh ? là tu me mets le doute ??? le script en lui même est le père... sauf la ligne avec "vamp..." qui contient à la fin le fameux "&" qui doit-être le fils ... non ?

Merci de m'expliquer... quelque chose doit d’échapper ?

Amicalement Slyfox

Dernière modification par Compte supprimé (Le 29/07/2013, à 12:08)

#5 Le 29/07/2013, à 12:19

tiramiseb

Re : [Résolu] Bash exporter variable fils à son père

Le fils, c'est uniquement l'exécutable "vamp". Ce n'est pas "la ligne avec vamp".

La variable "pid", dont la valeur est configurée par la ligne "pid=$!", est lisible en dehors de la boucle for : tu n'as pas besoin de passer par le fichier /home/slyfox/Bureau/test.txt.
Ou alors j'ai mal compris ton besoin.

Hors ligne

#6 Le 29/07/2013, à 12:29

Bigcake

Re : [Résolu] Bash exporter variable fils à son père

ah bah oui, d'accord j'avais pas compris, en fait, mais effectivement je 'plussoie' totalement avec ce que vient d'écrire tiramiseb


"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#7 Le 29/07/2013, à 13:24

Compte supprimé

Re : [Résolu] Bash exporter variable fils à son père

tiramiseb a écrit :

Le fils, c'est uniquement l'exécutable "vamp". Ce n'est pas "la ligne avec vamp".

La variable "pid", dont la valeur est configurée par la ligne "pid=$!", est lisible en dehors de la boucle for : tu n'as pas besoin de passer par le fichier /home/slyfox/Bureau/test.txt.
Ou alors j'ai mal compris ton besoin.

C'est bien là le problème $pid se fait "bouffer" par Zenity  mais si je suipprime "|  zenity --progress --auto-close" cela fonctionne... je peux récupérer le "$pid"

Dernière modification par Compte supprimé (Le 29/07/2013, à 13:24)

#8 Le 29/07/2013, à 13:36

Watael

Re : [Résolu] Bash exporter variable fils à son père

oh! le sournois pipe caché big_smile

salut,

ajoute l'instruction

shopt -s lastpipe

au début de ton script.
cela permet aux variables définies dans un pipe, qui normalement ne sont pas accessibles en dehors du sous-shell que crée un pipe, d'être accessibles au shell en cours.

Dernière modification par Watael (Le 29/07/2013, à 14:00)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 29/07/2013, à 14:02

Bigcake

Re : [Résolu] Bash exporter variable fils à son père

Sinon tu déclares ta variable pid avant la boucle :

pid=0
for i in $titres
[...]

Dernière modification par Bigcake (Le 29/07/2013, à 14:02)


"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#10 Le 29/07/2013, à 18:30

Compte supprimé

Re : [Résolu] Bash exporter variable fils à son père

@ Watael

Salut,

Si je fais ...

titres="1 2"
shopt -s lastpipe

for i in $titres
      do
      vamps -e 1 -a 01 -s 02 < "/home/slyfox/Bureau/video-Titre-$i.vob"  > "/home/slyfox/Bureau/video-Titre-$i.mpg" &
      pid=$!

      while [[ ! -z "$(pidof vamps | grep "$pid")" ]]
      do
      pourcentZenity=$(commande calculant le pour-cent de la nouvelle vidéo copiée)
      echo "$pourcentZenity" #Renvoi cette valeur du pourcentage à la boite zenity 
      done

done |  zenity --progress --auto-close

if   [[ "${PIPESTATUS[1]}" != "0" ]] 
then 
kill "$pid"
fi

echo "$pid"

le dernier "echo $pid" est vide... sad

@ Bigcake
Je ne peux pas déclarer $pid avant la boucle... car le pid récupère le numéro de processus de "vamps" qui est lancer en arrière plan... en plus il me sert à tuer "vamps" en cas de fermeture de Zenity.

Amicalement Slyfox

Dernière modification par Compte supprimé (Le 29/07/2013, à 23:02)

#11 Le 29/07/2013, à 18:31

Haleth

Re : [Résolu] Bash exporter variable fils à son père

Déclaration, affectation, c'est pas vraiment la même chose, hein ?


Ubuntu is an ancien African word which means "I can't configure Debian"

Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.

Hors ligne

#12 Le 29/07/2013, à 18:33

tiramiseb

Re : [Résolu] Bash exporter variable fils à son père

Haleth a écrit :

Déclaration, affectation, c'est pas vraiment la même chose, hein ?

Et même... il peut toujours affecter "0" à la variable pid, c'est faux de dire que c'est impossible.

La bonne valeur sera simplement affectée plus tard :-)

Hors ligne

#13 Le 29/07/2013, à 18:36

Compte supprimé

Re : [Résolu] Bash exporter variable fils à son père

@ tiramiseb

.. pas faux !!!
Mais dans le cas présent cela m'aide pas trop... quoi que c'est mieux d’initialiser les variable avant utilisation ... on ne sais jamais wink

Excuses moi... d'avoir mal compris...

Amicalement Slyfox

Dernière modification par Compte supprimé (Le 29/07/2013, à 18:39)

#14 Le 29/07/2013, à 18:38

tiramiseb

Re : [Résolu] Bash exporter variable fils à son père

Slyfox a écrit :

dans le cas présent cela m'aide pas trop... quoi que c'est mieux de l’initialiser... on ne sais jamais wink

La théorie de Bigcake est que, si la variable est déclarée avant la boucle for, sa valeur sera conservée.
Je ne sais pas si ça fonctionne comme ça avec Bash, je n'ai pas vérifié.
Mais ça ne coûte rien d'essayer.

Hors ligne

#15 Le 29/07/2013, à 18:41

Compte supprimé

Re : [Résolu] Bash exporter variable fils à son père

@tiramiseb

Je viens d'essayer de rajouter "pid="0" au début du script... il me retourne "0" au dernier echo... sad

titres="1 2"
pid="0"
shopt -s lastpipe

for i in $titres
      do
      vamps -e 1 -a 01 -s 02 < "/home/slyfox/Bureau/video-Titre-$i.vob"  > "/home/slyfox/Bureau/video-Titre-$i.mpg" &
      pid=$!

      while [[ ! -z "$(pidof vamps | grep "$pid")" ]]
      do
      pourcentZenity=$(commande calculant le pour-cent de la nouvelle vidéo copiée)
      echo "$pourcentZenity" #Renvoi cette valeur du pourcentage à la boite zenity 
      done

done |  zenity --progress --auto-close

if   [[ "${PIPESTATUS[1]}" != "0" ]] 
then 
kill "$pid"      #vamps n'est pas tué
fi

echo "$pid"

Amicalement Slyfox

Dernière modification par Compte supprimé (Le 29/07/2013, à 18:45)

#16 Le 29/07/2013, à 18:45

Zakhar

Re : [Résolu] Bash exporter variable fils à son père

Et pour répondre à la question initiale, non, il n'y a pas d'autre moyen de passer une info d'un fils à son père que via un fichier.

Après il y probablement des moyens détournés : pipes nommés, faire un netcat... mais tout ça, sous Linux, ce sont de toute façon des fichiers, donc la boucle est bouclée !.. tongue

Bien sûr, si c'est une info que le père connaît déjà (PID), c'est superflu (sauf peut-être dans ton cas à cause de zenity qui "bouffe" peut-être le PID).


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#17 Le 29/07/2013, à 20:35

Watael

Re : [Résolu] Bash exporter variable fils à son père

ok, j'avais mal compris : les deux parties d'un pipe sont exécutées dans un sous-shell.

Ici, lastpipe n'y fera rien, puisque l'assignation se fait dans la première partie du pipe sad

je ne vois pas d'autre choix : ce sera fichier!

Dernière modification par Watael (Le 29/07/2013, à 20:45)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#18 Le 29/07/2013, à 22:50

Compte supprimé

Re : [Résolu] Bash exporter variable fils à son père

@Zakhar

Merci ! tu m'as mis sur la voie avec le pipes nommés (fifo). J'ai fais une recherche sur le net et je suis tombé sur cette page http://linuxfr.org/forums/programmation-shell/posts/zenity-processus (poste du 19/07/11 à 15:11) que j'ai adapté à mon script... et là ça fonctionne, je peux récupéré ma variable "$pid"

titres="1 2"
pid="0"

fifo=$(mktemp -u)
mkfifo $fifo

zenity --progress --auto-close 2>/dev/null <"${fifo}" &
progress_pid="${!}"

exec 6>&1   # Save stdout
exec >"${fifo}" # Redirect stdout to the fifo

for i in $titres
      do
      vamps -e 1 -a 01 -s 02 < "/home/slyfox/Bureau/video-Titre-$i.vob"  > "/home/slyfox/Bureau/video-Titre-$i.mpg" &
      pid=$!

      while [[ ! -z "$(pidof vamps | grep "$pid")" ]]
      do
      pourcentZenity=$(commande calculant le pour-cent de la nouvelle vidéo copiée)
      echo "$pourcentZenity" #Renvoi cette valeur du pourcentage à la boite zenity 
      done

done

exec >&6 # Restore stdout
kill "${progress_pid}"


echo "$pid"

Mais perso je préfère quand même l'utilisation d'un fichier comme mon premier poste... c'est plus simple à mettre en place et plus compréhensible en tout cas pour moi. tongue
donc pour moi ce sujet est résolu...

Merci à tous pour votre aide et le partage !!! smile

Amicalement Slyfox

NB : Je vais quand même analysé ce dernier script, il y a certainement des choses à apprendre au cas ou... wink

Dernière modification par Compte supprimé (Le 29/07/2013, à 22:53)

#19 Le 29/07/2013, à 23:29

Watael

Re : [Résolu] Bash exporter variable fils à son père

avec coproc:

#!/bin/bash

coproc zenity --progress --auto-close

for i in $titres
      do
      vamps -e 1 -a 01 -s 02 < "/home/slyfox/Bureau/video-Titre-$i.vob"  > "/home/slyfox/Bureau/video-Titre-$i.mpg" &
      pid=$!

      while [[ ! -z "$(pidof vamps | grep "$pid")" ]]
      do
      pourcentZenity=$(commande calculant le pour-cent de la nouvelle vidéo copiée)
      echo "$pourcentZenity" #Renvoi cette valeur du pourcentage à la boite zenity 
      done

done >&${COPROC[1]}

kill "${COPROC_PID}"

echo "$pid"

Dernière modification par Watael (Le 29/07/2013, à 23:29)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#20 Le 30/07/2013, à 00:49

Zakhar

Re : [Résolu] Bash exporter variable fils à son père

Slyfox a écrit :

Mais perso je préfère quand même l'utilisation d'un fichier comme mon premier poste... c'est plus simple à mettre en place et plus compréhensible en tout cas pour moi. tongue
donc pour moi ce sujet est résolu...

Tout à fait d'accord avec ça.

C'est d'ailleurs une technique bien connue qui s'appelle KISS (Keep It Simple Stupid). Parce que un truc simple est largement plus facile à maintenir... ce qui est important en shell vu la maintenabilité assez faible !..

Et comme je le disais aussi plus haut, de toute façon, vu de Linux, un pipe nommé est un fichier, et ça ne change donc pas grand chose que tu fasses un fichier "standard". La seule différence est que le pipe nommé, le kernel va tâcher de le garder en mémoire, mais si tu as monté ton /tmp en RAM ou tu mets ton fichier dans /dev/shm (monté en RAM par défaut), ça va vraiment être tout proche du pipe nommé !..

En fait tu as une seule différence significative ici, c'est que ton shell n'est pas "parallélisable".
Vu que tu as pris un nom de fichier fixe pour échanger les informations, si tu lances deux fois le shell en parallèle sur deux fichiers différents que tu veux traiter en même temps, tu as des risques d'écrasement.
Tu peux facilement améliorer ça en utilisant mktemp qui va te créer un fichier temporaire avec un nom unique. C'est d'ailleurs une bonne pratique de faire ainsi lorsque tu fais des fichiers temporaires.

Dernière modification par Zakhar (Le 30/07/2013, à 00:54)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#21 Le 30/07/2013, à 12:08

Compte supprimé

Re : [Résolu] Bash exporter variable fils à son père

@ Zakhar

Merci pour ce complément d'info !

Surtout le mktemp... commande que je ne connaissez pas... et qui va me simplifié un peu la vie. smile

Amicalement Slyfox