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"
Cet article, publié dans Langage, est tagué . Ajoutez ce permalien à vos favoris.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s