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 18/04/2010, à 11:37

®om

File d'attente en shell?

Salut,

Je cherche à utiliser une "file d'attente" d'actions à effectuer.

Par exemple:

mettreenfile "ffmpeg2theora file1.avi"
mettreenfile "ffmpeg2theora file2.avi"
mettreenfile "ffmpeg2theora file3.avi"

met 3 fichiers en file d'attente, l'outil les exécute dans l'ordre séquentiellement.

Des actions doivent pouvoir être mises en file à n'importe quel moment, de n'importe où. Par exemple, la 2e ligne peut être exécutée alors que l'encodage de file1 a déjà commencé depuis 2 minutes (voire qu'il est déjà terminé).

De plus, je voudrais qu'il soit possible de configurer le nombre de "workers" en parallèle. S'il y a 1 worker, tout est séquentiel, s'il y a 2 workers, le premier prend l'encodage de file1, le second prend l'encodage de file2, et le premier des deux qui a fini prendra l'encodage de file3.

Connaissez-vous un outil qui fait ça?

Merci d'avance.

Dernière modification par ®om (Le 18/04/2010, à 12:33)

Hors ligne

#2 Le 18/04/2010, à 12:42

Totor

Re : File d'attente en shell?

Bonjour,

xargs -I{} -P 2 ffmpeg2theora {} <<EOF
file1.avi
file2.avi
file3.avi
...
fileN.avi
EOF

Sinon mon paralleliseur...


-- Lucid Lynx --

Hors ligne

#3 Le 18/04/2010, à 13:08

®om

Re : File d'attente en shell?

Merci ça a l'air sympa avec xargs.

Par contre, avec ça, on ne peut pas mettre en file une fois que le premier est lancé, si? (à partir d'un script)

Sinon, je vais regarder ton paralleliseur :-)

Dernière modification par ®om (Le 18/04/2010, à 13:08)

Hors ligne

#4 Le 18/04/2010, à 13:13

ezaeza

Re : File d'attente en shell?

J'avais commencer à regarder une solution avant la réponse d'au dessus, donc je poste quand même, même si il semble déjà y avoir une solution

donc voilà le script que je viens d'écrire vite fait

#!/bin/bash
# mise en file d'attente

fifo=/tmp/file
nbWorker=2

if [ -e "$fifo" ]
then 
	echo "Fifo existante dans $fifo"
else 
	echo "Création de la fifo dans $fifo"
	mkfifo "$fifo"
fi

worker() {
	while [ 0 ]
	do
		echo "worker $1"
		read line < $fifo
		$line
	done
}

for ((i=0;i<$nbWorker; i++))
do
	worker $i &
done

read quit

Il est pas terrible dans l'état actuel des choses, il ne coupe pas tous les threads quand on le coupe, il faut donner les arguments en chemin absolu, donc reste à modifier ...

Je fait un script de test :

#!/bin/bash

sleep 3
echo "fini $1"

À exécuter de la manière suivante en modifiant le chemin de test.sh et après avoir exécuté le premier script :
for ((i=0; i<5; i++)); do echo "/home/ezaeza/test.sh $i" > /tmp/file & sleep 0.5; done

Et donc à la vu de l'exemple pour rajouter une commande dans la file d'attente, ça se passe comme ça :

echo "commande param1 param2 ... " > /tmp/file &

Dernière modification par ezaeza (Le 18/04/2010, à 13:18)

Hors ligne

#5 Le 18/04/2010, à 13:32

Totor

Re : File d'attente en shell?

®om a écrit :

Par contre, avec ça, on ne peut pas mettre en file une fois que le premier est lancé, si? (à partir d'un script)

Non, c'est également le cas de mon script.


-- Lucid Lynx --

Hors ligne

#6 Le 18/04/2010, à 13:36

®om

Re : File d'attente en shell?

mkfifo a l'air sympa, par contre je ne comprends pas trop comment il marche, notamment sur cet exemple :

mkfifo /tmp/fifo

Ensuite, dans 3 shells différents :

echo A > /tmp/fifo
echo B > /tmp/fifo

Les deux commandes sont "bloquées".

read line < /tmp/fifo
echo $line

Bizarrement, la 3e commande termine les 2 premières, et on ne récupère que le "A", pas le "B".

Si quelqu'un a une idée…

Hors ligne

#7 Le 18/04/2010, à 14:25

ezaeza

Re : File d'attente en shell?

Effectivement y'a un souci :s

Pour récupérer toutes les lignes faut utiliser cat, mais après c'est le bordel à traiter sad

Hors ligne

#8 Le 18/04/2010, à 15:40

Totor

Re : File d'attente en shell?

ezaeza a écrit :

Effectivement y'a un souci :s

Pour récupérer toutes les lignes faut utiliser cat, mais après c'est le bordel à traiter sad

non, cat n'est pas utile.

Pour utiliser les tubes, il faut 2 process (un écrivain, un lecteur) :

process "lecteur" :

tube=/tmp/fifo
[ -p ${tube} ] || mkfifo ${tube}

exec 4 < ${tube}

while [ "${REPLY}" != "fin" ]; do
  read -u4
  [ "${REPLY}" != fin ] && {
    <traitement>
  }
done

Process écrivain :

tube=/tmp/fifo
[ -p ${tube} ] || mkfifo ${tube}

exec > ${tube}

echo "file 1"
echo "file 2"
...
echo "fin"

Il faut lancer les 2 process en parallèle.

Note : je n'ai absolument pas testé mais le principe est là


-- Lucid Lynx --

Hors ligne

#9 Le 18/04/2010, à 16:31

®om

Re : File d'attente en shell?

Merci de vos réponses.

J'ai réussi à faire un mélange de vos propositions, pour obtenir un truc très court.

Le serveur :

tasks=/tmp/tasks
[ -p "$tasks" ] || mkfifo "$tasks"
tail -f "$tasks" | xargs -I{} -P 2 ffmpeg2theora {}

Un client quelconque :

echo /home/rom/monfichier.avi > /tmp/tasks

Faudrait un peu de code en plus pour vérifier que le serveur n'est pas planté, etc, mais dans l'idée ça fonctionne bien.

Ça fonctionnerait aussi avec un fichier "normal" (pas un fifo), en faisant echo fichier >> /tmp/tasks, mais là quand on relance le serveur il va tout recommencer même ce qu'il a déjà fait.

Si vous avez des idées d'amélioration.

Dernière modification par ®om (Le 18/04/2010, à 16:41)

Hors ligne

#10 Le 18/04/2010, à 16:54

®om

Re : File d'attente en shell?

(bon maintenant je suis embêté si je veux passer plusieurs paramètres dans le tube, par exemple le fichier à encoder ET sa destination, car en paramètre de xargs on ne peut pas passer comme commande une fonction bash définie juste au-dessus, et ça m'embête de créer un exécutable juste pour ça)

Dernière modification par ®om (Le 18/04/2010, à 16:56)

Hors ligne

#11 Le 18/04/2010, à 18:36

®om

Re : File d'attente en shell?

Je recherche également des idées, pour faire un script init.d propre, comment arrêter proprement :

tail -f "$tasks" | xargs -I{} -P 2 macommande {}

Hors ligne

#12 Le 21/04/2010, à 19:07

®om

Re : File d'attente en shell?

Me revoilà.

J'ai un problème, je n'arrive pas à passer plus d'un argument correctement;

En gros, je voudrais, à partir de n'importe où, faire :

ffmpeg2theora-later /home/moi/file.avi -o /home/moi/file.ogv

et que mon xargs exécute à partir de la file d'attente :

ffmpeg2theora /home/moi/file.avi -o /home/moi/file.ogv

Mais quand je fais :

tail -f /tmp/fifo | xargs -I{} -P 2 ffmpeg2theora {}

{} est passé comme un seul argument, donc il me dit que le fichier '/home/moi/file.avi -o /home/moi/file.ogv' n'existe pas.

Je ne trouve pas de solution qui permette de faire ce que je veux :-(

Si quelqu'un a une idée…

(le top serait de séparer les arguments de ffmpeg2theora-later avec un \0 et de les remettre comme il faut en paramètre de ffmpeg2theora)

Dernière modification par ®om (Le 21/04/2010, à 20:40)

Hors ligne

#13 Le 25/04/2010, à 15:25

®om

Re : File d'attente en shell?

Voilà j'ai réussi à faire ce que je voulais : Agréger différentes sources de VOD en OGG/Theora.

Hors ligne