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 08/11/2015, à 10:28

Compte supprimé

[Résolu] Yad progress comment quitter et stopper processus en cours ?

Bonjour,

Voici un extrait d'un script qui ne fonctionne pas...

mplayer -dvd-device /dev/sr0 dvd://1 -dumpaudio -dumpfile "/home/audio.wav" | awk -vRS='\r' -F [~.] \
          '/%)/ {
          {pourcent = $2};
          {printf "\n%d\n" ,pourcent
           printf "#Pourcent copié sur le disque dur: %d %" , pourcent ; fflush();}}' 2>&1 | zenity --progress --auto-close --auto-kill

Pour info ce script extrait l'audio d'un DVD et en même temps envoi à Zenity le pourcentage.

Le problème c'est que je n'arrive pas à fermer la fenêtre Zenity et à arrêter Mplayer si je clic sur "Annuler".

Avant de poster j'ai vu sur internet  et essayer de faire un fifo, récupérer le pid, de mettre en arrière plan... mais rien de concluant.

C'est pourquoi je viens vers vous pour un coups de pouce ! cool

Dernière modification par Compte supprimé (Le 08/11/2015, à 22:00)

#2 Le 08/11/2015, à 12:21

sergeG75018

Re : [Résolu] Yad progress comment quitter et stopper processus en cours ?

Sous yad fork de zenity si tu as plusieurs actions il faut créer une fonction.
Teste ça avec zenity.
function arreter () {
killall yad
killall mplayer
}
export -f arreter
yad --progress --auto-close --auto-kill --button="Annuler:bash -c arreter"



edit bach -> bash et il faut l'exporter.

Dernière modification par sergeG75018 (Le 08/11/2015, à 12:29)


Ironie, sarcasme ou cynisme? Je ne sais plus

Hors ligne

#3 Le 08/11/2015, à 12:43

Compte supprimé

Re : [Résolu] Yad progress comment quitter et stopper processus en cours ?

Salut

Pour moi yad me convient parfaitement (à vrai dire je le préfère à zenity).

J'ai essayé ce que tu me conseille ci-dessus:

#! /bin/bash

function stop () {
killall yad
killall mplayer
}

mplayer -dvd-device /dev/sr0 dvd://1 -dumpaudio -dumpfile "audio.wav" | awk -vRS='\r' -F [~.] \
          '/%)/ {
          {pourcent = $2};
          {printf "\n%d\n" ,pourcent
           printf "#Pourcent copié sur le disque dur: %d %" , pourcent ; fflush();}}' 2>&1 | yad --progress --auto-close --auto-kill --button="Annuler:bach -c stop"

Mais... ça ne fonctionne pas.

Dernière modification par Compte supprimé (Le 08/11/2015, à 12:51)

#4 Le 08/11/2015, à 12:46

sergeG75018

Re : [Résolu] Yad progress comment quitter et stopper processus en cours ?

j'ai modifier mon post avant ta réponse


Ironie, sarcasme ou cynisme? Je ne sais plus

Hors ligne

#5 Le 08/11/2015, à 18:32

Compte supprimé

Re : [Résolu] Yad progress comment quitter et stopper processus en cours ?

sergeG75018 a écrit :

j'ai modifier mon post avant ta réponse

Désolé chez moi cela ne fonctionne pas. sad

Par contre voici une solution qui fonctionne mieux.

#!/bin/bash

(mplayer -dvd-device /dev/sr0 dvd://1 -dumpaudio -dumpfile "audio.wav" | awk -vRS='\r' -F [~.] \
          '/%)/ {
          {pourcent = $2};
          {printf "\n%d\n" ,pourcent; fflush();}}') 2>&1 | yad --progress --auto-close --auto-kill --title "Mplayer-audio-mp3" --text="Ripe de audio en cours ..." --percentage=1 --width=640 --height=100  &

# Get Zenity Brother Process Which is Parent of All Running Tasks
PID_ZENITY=$(ps -C yad h -o pid,command | awk '/Ripe de audio en cours/ {print $1}')
PID_PARENT=$(ps -p ${PID_ZENITY} -o ppid=)
PID_CHILDREN=$(pgrep -d ',' -P ${PID_PARENT})

# Loop To Check That Progress Dialog Has Not Been Cancelled
while [ "$PID_ZENITY" != "" ]
do
# Get PID of Running Processes For The Children
  PID_GRANDCHILDREN=$(pgrep -d ' ' -P "${PID_CHILDREN}")

# Check if Zenity PID is Still There (Dialog Box Still Open)
  PID_ZENITY=$(ps h -o pid -p ${PID_ZENITY})

# Sleep for 2 Second
  sleep 2
done

# if Some Running Tasks are Still There, Kill Them
[ "${PID_GRANDCHILDREN}" != "" ] && kill -9 ${PID_GRANDCHILDREN}

Avec un petit bémol... si je rajoute la partie "printf "#Pourcent copié sur le disque dur: %d %" , pourcent" au script

#!/bin/bash

(mplayer -dvd-device /dev/sr0 dvd://1 -dumpaudio -dumpfile "audio.wav" | awk -vRS='\r' -F [~.] \
          '/%)/ {
          {pourcent = $2};
          {printf "\n%d\n" ,pourcent; printf "#Pourcent copié sur le disque dur: %d %" , pourcent; fflush();}}') 2>&1 | yad --progress --auto-close --auto-kill --title "Mplayer-audio-mp3" --text="Ripe de audio en cours ..." --percentage=1 --width=640 --height=100  &

# Get Zenity Brother Process Which is Parent of All Running Tasks
PID_ZENITY=$(ps -C yad h -o pid,command | awk '/Ripe de audio en cours/ {print $1}')
PID_PARENT=$(ps -p ${PID_ZENITY} -o ppid=)
PID_CHILDREN=$(pgrep -d ',' -P ${PID_PARENT})

# Loop To Check That Progress Dialog Has Not Been Cancelled
while [ "$PID_ZENITY" != "" ]
do
# Get PID of Running Processes For The Children
  PID_GRANDCHILDREN=$(pgrep -d ' ' -P "${PID_CHILDREN}")

# Check if Zenity PID is Still There (Dialog Box Still Open)
  PID_ZENITY=$(ps h -o pid -p ${PID_ZENITY})

# Sleep for 2 Second
  sleep 2
done

# if Some Running Tasks are Still There, Kill Them
[ "${PID_GRANDCHILDREN}" != "" ] && kill -9 ${PID_GRANDCHILDREN}

Cela ne fonctionne plus ! je ne comprends pas pourquoi. J'ai l'impression que le fait que awk écrit sur le pipe que cela fout le bazar ?

Dernière modification par Compte supprimé (Le 08/11/2015, à 18:37)

#6 Le 08/11/2015, à 19:12

sergeG75018

Re : [Résolu] Yad progress comment quitter et stopper processus en cours ?

pour ce qui est de ton script je ne sais pas.
pour yad tu ne peux pas donner plusieurs action a un bouton d'ou l'obligation de faire une fonction.
pour en revenir à ta demande

Slyfox a écrit :

Le problème c'est que je n'arrive pas à fermer la fenêtre Zenity et à arrêter Mplayer si je clic sur "Annuler".

Tu as 3 actions a faire
arrêter mplayer
arreter ton script
fermer la fenêtre de yad
Lorsque tu lance ta fonction avec bash -c tu ouvre en fait un autre shell de fait tes fonctions et variable ne peuvent être exporter dans le nouveau shell
donc
killall yad c'est ok
killall mplayer c'est ok
mais pour tuer ton script tu devra creer un fichier avec le pid du script

pid=$(echo $$)
echo "$pid" > /tmp/.pid.txt
function arreter () {
killall yad
killall mplayer
pid=$(cat /tmp/.pid.txt)
rm /tmp/.pid.txt
kill -9 "$pid"
}
export -f arreter
ta ligne de commande | yad --progress --auto-close --auto-kill --button="Annuler:bash -c arreter"

Voila
bye

Dernière modification par sergeG75018 (Le 08/11/2015, à 19:23)


Ironie, sarcasme ou cynisme? Je ne sais plus

Hors ligne

#7 Le 08/11/2015, à 21:49

Compte supprimé

Re : [Résolu] Yad progress comment quitter et stopper processus en cours ?

Merci ça marche !!! smile smile smile

Je me suis permis "d'améliorer" ton script... en effet si plusieurs fenêtre yad étaient ouvertes ça les fermaient toutes...

Voici le script:

#!/bin/bash

pid=$(echo $$)
echo "$pid" > /tmp/.pid.txt

function arreter () {
PidYad=$(ps -C yad h -o pid,command | awk '/Ripe de audio en cours/ {print $1}')
PidMplayer=$(ps -C mplayer h -o pid,command | awk '/audio.wav/ {print $1}')
kill -9 ${PidYad}
kill -9 ${PidMplayer}
pid=$(cat /tmp/.pid.txt)
rm /tmp/.pid.txt
kill -9 "$pid"
}

export -f arreter

mplayer -dvd-device /dev/sr1 dvd://1 -dumpaudio -dumpfile "audio.wav" 2>&1 | awk -vRS='\r' -F [~.] \
          '/%)/{
          {pourcent = $2};
          {printf "\n%d\n" ,pourcent; printf "#Pourcent copié sur le disque dur: %d %" , pourcent; fflush()}}' | awk '!x[$0]++;fflush();' | yad --progress --title="Ripe de audio en cours ..."--auto-close --auto-kill --button="Annuler:bash -c arreter"

Petite explication sur cette ligne:

ps -C yad h -o pid,command | awk '/Ripe de audio en cours/ {print $1}'

Recherche tous les pid relatif à la ou les fenêtre yad ouvertes avec leur numéro de pid et la commande avec laquelle ils ont était lancé par exemple:
"27727 yad --progress --title=Ripe de audio en cours ...--auto-close --auto-kill --button=Annuler:bash -c arreter"
ensuite awk recherche la ligne contenant "Ripe de audio en cours" et imprime le numéro du pid qui sera utilisé pour tuer le processus yad.

Encore merci pour ton aide !