Lors de la réalisation de l’automatisation de conversion vidéo dans le billet précédent, nous avons déja vu comment empêcher la réentrance avec la création d’un fichier « .lock ». Ce fichier est un artéfact de travail qui doit être supprimé quand le script se termine. Or le script peut être interrompu (tué) avant qu’il n’arrive à son terme.
Dans ce cas il faut quand même essayer de faire le ménage afin de permettre à nouveau l’execution du script. Bash contient une instruction trap qui permet de répondre aux signaux systèmes (SIGXXX) sauf SIGKILL (kill -9). Cela laisse en fait toute la lattidute de réagir au CTR-C ou à la commande kill de base (sans le -9).
Dans l’exemple du billet précédent l’interception des signaux peut être utilisée pour d’une part, supprimer le fichier qui était en train d’être encodé car il sera incomplet et d’autre part pour supprimer le fichier « .lock ». Le code suivant en illustre la mise en oeuvre:
#!/bin/bash echo "***********************************" echo "* *" echo "* video converter for N900 *" echo "* *" echo "***********************************" INPUT_DIR=. OUTPUT_DIR=$INPUT_DIR/converted # do not allow concurrency if [ -e "$INPUT_DIR/.lock" ]; then exit 1 else touch "$INPUT_DIR/.lock" fi function convert_file { original_def=$2 original_file=$1 converted_file="$OUTPUT_DIR/$original_file.mp4" if [ -e "$converted_file" ]; then return 1 fi if [ $original_def == "mpeg" ]; then SIZE="400x480" elif [ $original_def == "dvd" ]; then SIZE="592x480" elif [ $original_def == "hd" ]; then SIZE="640x480" elif [ $original_def == "other" ]; then SIZE="320x240" else echo "format $original_def inconnu" return 1 fi echo $converted_file > .work_in_progress (ffmpeg -i "$original_file" -acodec libfaac -vcodec libx264 -vpre hq -vpre baseline -crf 25 -maxrate 1000k -bufsize 2000k -threads 0 -flags2 -fastpskip -s "$SIZE" "$converted_file" ) & echo $! > .work_pid wait if [ $? -eq 0 ]; then rm "$original_file" fi rm .work_pid rm .work_in_progress } function clean_shutdown { echo "shutdown sequence..." if [ -e ".work_pid" ]; then kill `cat .work_pid` rm .work_pid fi if [ -e .work_in_progress ]; then rm "`cat .work_in_progress`" rm .work_in_progress fi rm .lock exit 1 } trap 'clean_shutdown' SIGTERM SIGINT find $INPUT_DIR -maxdepth 1 -type f ( -name "France 3*.ts" -o -name "France 4*.ts" -o -name "France 5*.ts" -o -name "La Chaîne*.ts" -o -name "NT1*.ts" -o -name "TMC*.ts" ) -print | ( while read i; do convert_file "$i" mpeg; done ) find $INPUT_DIR -maxdepth 1 -type f ( -name "DirectStar*.ts" -o -name "RTL9*.ts" -o -name "AB*.ts" ) -print | ( while read i; do convert_file "$i" dvd; done ) find $INPUT_DIR -maxdepth 1 -type f ( -name "Arte*.ts" -o -name "Direct 8*.ts" -o -name "France 2*.ts" -o -name "NRJ*.ts" ) -print | ( while read i; do convert_file "$i" hd; done ) find $INPUT_DIR -maxdepth 1 -type f ( -name "*.mpeg" -o -name "*.vob" -o -name "*.mpg" -o -name "*.avi" ) | ( while read i; do convert_file "$i" other; done ) rm "$INPUT_DIR/.lock"Tags: bash