2016-01-28 4 views
0

je suis arrivé à hier solution avec l'aide d'ici (il est de trouver une liste de répertoires à traiter avec HandBrakeCLI, et de mettre les résultats dans un répertoire codé en dur):Le processus d'appel en boucle prend beaucoup de temps. Comment en sortir?

#!/bin/bash 
source_dir=/Volumes/VolumeName 
dest_dir=/Volumes/OtherName 

export dest_dir # export allows use by subprocesses! 

find "$source_dir" -type d -name "VIDEO_TS" -exec bash -c ' 
    for dir; do 
    name=${dir%/VIDEO_TS} 
    name=${name##*/} 
    ./HandBrakeCLI -i "$dir" -o "$dest_dir/$name.m4v" 
    done 
' _ {} + 

Le script shell fonctionne très bien, mais si je tente de l'arrêter en tuant le processus principal:

kill -9 <pid> 

il semble fonctionner mais revient à la vie et appelle HandBrakeCLI avec le fichier suivant dans la liste générée par trouver.

Existe-t-il un moyen d'arrêter de manière fiable tout cela? Je suppose que d'une façon ou d'une autre les appels futurs à la CLI sont mis en file d'attente/en cache, mais quelqu'un pourrait-il expliquer ce qui se passe s'il vous plaît?

+0

Je suggère d'utiliser commande 'trap'. Voir 'piège d'aide '. – Cyrus

+0

Merci. Je peux voir le principe, mais je n'arrive pas à comprendre l'application ici. Si je place quelque chose comme 'trap \' du code \ '2' en haut du fichier, je ne pense pas que cela ajoute quelque chose car je peux déjà envoyer ctrl-C au script principal. Alors, est-ce que je le mets quelque part dans la boucle do ... done et que dois-je faire dans la partie code? – Lorccan

Répondre

0

Votre script est rendu inutilement complexe en invoquant bash à partir de find. Je suggère d'itérer sur la sortie de find.

#!/usr/bin/env bash 

source_dir=/Volumes/VolumeName 
dest_dir=/Volumes/OtherName 

find "${source_dir}" -type d -name "VIDEO_TS" | while read dir; do 
    name=${dir%/VIDEO_TS} 
    name=${name##*/} 
    ./HandBrakeCLI -i "${dir}" -o "${dest_dir}/${name}.m4v" 
done 
+0

Merci pour votre suggestion. Si j'essaie, j'ai deux problèmes: avec les accolades autour des vars dans l'appel HandBrakeCLI j'obtiens une erreur de 'mauvaise substitution' et ii. Si je supprime ces parenthèses, la boucle ne s'exécute qu'une seule fois (même s'il y a plus d'un répertoire retourné par find). – Lorccan

+0

Vous pouvez essayer de déboguer le script en ajoutant un 'echo' devant './HandBrakeCLI'. Cela vous permettra de voir exactement comment la commande sera appelée sans l'exécuter. –

+0

Comme je l'ai dit dans mon autre post, il y a un problème avec ffmpeg consommant toutes les entrées. – Lorccan

0

J'ai découvert qu'il ya un problème avec l'utilisation trouver canalisée à boucle while comme suggéré par @JonNailey avec HandBrakeCLI (et d'autres processus qui font appel ffmpeg): il aspire "toutes les entrées de la commande find et meurt de faim la boucle. Voir http://mywiki.wooledge.org/BashFAQ/089 pour plus de détails.

La solution que j'ai choisi était de mettre cette redirection sur la ligne d'appel HandBrakeCLI:

</dev/null