Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 07-11-2015 19:11:28

Slyfox
Membre
Lieu : Pays du chocolat
Distrib. : GNU/Linux Debian Sid
Noyau : Linux 4.7.0-1-amd64
(G)UI : MATE
Inscription : 15-12-2013

[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 | yad --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 Slyfox (08-11-2015 22:04:54)

Hors ligne

#2 08-11-2015 18:36:33

Slyfox
Membre
Lieu : Pays du chocolat
Distrib. : GNU/Linux Debian Sid
Noyau : Linux 4.7.0-1-amd64
(G)UI : MATE
Inscription : 15-12-2013

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

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 Slyfox (08-11-2015 18:37:13)

Hors ligne

#3 08-11-2015 22:04:26

Slyfox
Membre
Lieu : Pays du chocolat
Distrib. : GNU/Linux Debian Sid
Noyau : Linux 4.7.0-1-amd64
(G)UI : MATE
Inscription : 15-12-2013

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

Je poste la solution à mon problème si ça peut servir à quelqu'un d'autre. wink

#!/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.

Hors ligne

Pied de page des forums