#1 Le 08/11/2015, à 09: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 !
Dernière modification par Compte supprimé (Le 08/11/2015, à 21:00)
#2 Le 08/11/2015, à 11: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, à 11:29)
Ironie, sarcasme ou cynisme? Je ne sais plus
Hors ligne
#3 Le 08/11/2015, à 11: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, à 11:51)
#4 Le 08/11/2015, à 11: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, à 17:32
- Compte supprimé
Re : [Résolu] Yad progress comment quitter et stopper processus en cours ?
j'ai modifier mon post avant ta réponse
Désolé chez moi cela ne fonctionne pas.
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, à 17:37)
#6 Le 08/11/2015, à 18: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
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, à 18:23)
Ironie, sarcasme ou cynisme? Je ne sais plus
Hors ligne
#7 Le 08/11/2015, à 20:49
- Compte supprimé
Re : [Résolu] Yad progress comment quitter et stopper processus en cours ?
Merci ça marche !!!
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 !