C'est quoi un pirate ? Un pirate, c'est toi, c'est moi. Un militant anti HADOPI, un habitué du p2p, un bidouilleur, un amateur de gratuit et de bons plans, un curieux du web et de son fonctionnement, un défenseur de l'internet libre.. Un bon gros geek, quoi. En fait, on est tous des pirates ! Et le web nous appartient.

Les notions de base du script bash sous Linux

Rien n'est plus bête que de créer des scripts sous Linux, du moins si l'on se contente de sa fonction la plus basique : automatiser une série de commandes. Rien n'est plus bête, mais à condition de connaître les notions de commandes sous Linux. Si ce n'est pas le cas, rendez vous sur l'article qui en traite.

On appelle script un fichier contenant une telle série de commandes. Il peut également intégrer des boucles et des conditions, mais nous ne rentrerons pas à ce point dans les détails dans cet article.

Un script de base est donc d'un fichier qui contient une série de commandes à exécuter, afin d'automatiser une tâche.
Il suffit de créer un nouveau fichier contenant la liste des commandes à effectuer, ligne par ligne, et de le nommer avec une extension en .sh

Prenons un exemple : voici le script playlist.sh : ce script permet de générer une playlist à partir des mp3 contenus dans un dossier.

echo Bonjour je suis le script playlist.sh et je vais te constituer ta playlist
ls -1d /dossier/musique/*.mp3 >> playlist.m3u
mkdir /dossier/playlists && mv playlist.m3u /dossier/playlists/nouvelle_liste.m3u
echo -n "J'ai terminé le : " && date

Un script peut également contenir des arguments, pour plus de souplesse.

C'est à dire qu'une partie de son comportement va dépendre des données que vous lui donnez quand vous le lancez.

Voici le script playlist2.sh : ce script permet lui aussi de générer une playlist, mais cette fois, celui qui le lance définis le dossier où chercher la musique, et choisis le nom de sa playlist.

echo Bonjour je suis le script playlist2.sh et je vais te constituer ta playlist
ls -1d $1 >> playlist.m3u
mkdir /dossier/playlists && mv playlist.m3u /dossier/playlists/$2
echo -n "J'ai terminé le : " && date

Que se passe-t-il ? $1 est votre premier argument. $2 est votre 2ème argument. Vous saisissez le principe.

il suffira de taper :
playlist2.sh /dossier/de/mes/musiques nomdemaplaylist.m3u
et dans votre script, $1 = /dossier/de/mes/musiques tandis que $2 = nomdemaplaylist.m3u

Du coup, si je tape
playlist2.sh /dossier/musique/rock quedurock.m3u

Le script exécutera les commandes suivantes :
echo Bonjour je suis.....
ls -1d /dossier/musique/rock >> playlist.m3u
mkdir /dossier/playlists && mv playlist.m3u /dossier/playlists/quedurock.m3u
echo -n "J'ai terminé......"

Un seul script peut ainsi être réutilisé à l'infini pour faire les playlists que vous voulez. C'est même l'un des gros intérêts d'un script.

Autre exemple de ce que peut faire un script ?
Supposez que vous vouliez faire tourner un programme 24h/24, mais qu'il plante souvent. Nous allons faire un script permettant de le relancer automatiquement.

while true
do
        if ! /sbin/pidof <nom du programme> >/dev/null 2<&1; then
                <nomduprogramme>;
        fi
        sleep 5;
done

Le script revérifie toutes les 5 secondes que le programme est toujours en route à l'aide d'une boucle de type while, et si ce n'est pas le cas (parce qu'il a planté), le relance.

Bon, mais ça pose un petit problème, notamment dans le cadre d'un serveur dédié sous linux : on peut perdre l'accès au script. Il est lancé, mais on n'a plus accès au terminal dans lequel il était lancé, et on ne peut donc plus le contrôler ni l'arrêter.
Dans ce cas comment l'éteindre de manière simple, si on souhaite finalement éteindre le programme ? On pourrait faire killall -9 <programme>, mais il serait alors immédiatement relancé par notre script. Embêtant.

Comment faire alors ?

Facile, on va rajouter une ligne au script, qu'on va mettre au tout début du script. Le script débutera par la ligne suivante :

echo -n $$ > ./kill.txt

L'intérêt ? "$$" correspond au process-id (pid) du script, c'est à dire un numéro unique qui l'identifie. Il est enregistré dans kill.txt - cela permet de savoir à tout moment quel est le pid que l'on doit tuer pour empêcher notre programme de se relancer automatiquement.

Ensuite, on crée un deuxième script, qui contient le code suivant :

kill -9 $(cat kill.txt)
killall -9 <programme>

Que fait ce second script ?

Il tue le programme dont le pid est égal à "contenu de kill.txt" : c'est à dire notre fameux script qui relance le programme. Ensuite, il tue le programme. Efficace.

Vous pouvez donc avoir ainsi un script auto-machin.sh qui relance automatiquement machin, et kill-machin.sh qui permet de l'éteindre et d'éviter qu'il se relance. Vous pouvez aussi rajouter des arguments à vos scripts si ça vous amuse, ou si vous en avez besoin.

Encore une fois, nous n'avons fait que frôler les bases du scripting sous linux. Mais vous avez déjà vu des scripts capables d'être réutilisés, le concept des arguments, l'utilisation d'opérateurs.

Bref, vous commencez à vous faire un début d'idée de combien un script peut vous simplfier la vie sous Linux, faire des choses plus vite. Vous commencez aussi à comprendre l'intérêt de certaines commandes linux, peu utiles seules, mais très pratiques au sein d'un script bash.

A vous maintenant d'imaginer les scripts en fonction de vos besoins, il n'y a pas de réelles limites à ce qu'on peut faire. Et si vraiment vous atteignez les limites du langage bash, il sera toujours temps de passer au perl.