Nettoyage en cas de terminaison brusque d’un script Bash

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"

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.