Bon ce chapitre risque d'etre super long mais bon si il y a des bonnes volontées pour m'aider je ne dit pas non, le tout est de laisser de reposer César ... car je l'agonie de questions chaque jour .....
C'est parti !!!!
Suite au plus long message jamais reçu sur mon livre d'or, j'ai eu l'autorisation d'Aurelien de publier les mutliples astuces qu'il m'a donné !
Si tu veux pouvoir exécuter ton script sans avoir à taper l'adresse complète du fichier, histoire d'avoir une
commande simple, comme 'grep', 'man', 'tar', etc.
Il faut savaoir que les commandes (ou les liens vers ces commandes) sont toutes contenues dans le répertoire /usr/bin/
(en tout cas, c'est comme ça sous la RedHat). Pour y écrire, il faut passer sous root
$ su
password : tonmotdepasse
(mais ça, tu connais déjà ;-)) )
tu vas dans le répertoire qui contient l'ensemble des commandes : /usr/bin/
$ cd /usr/bin/
$ ln -s /chemin_vers_le_script/nom_script /usr/bin/nom_lien
cette commande magique crée un lien symbolique vers le fichier '/chemin_vers_le_script/nom_script'
(mais ça, tu connais aussi ! (soi-dit en passant, tu peux mettre autant de liens que tu veux sur la même ligne de
commande, il t'en créera alors plusieurs))
Maintenant, quand tu voudras exécuter ton script, il te suffira de taper :
$ nom_lien
et ce, où que tu sois, au lieu de
$ /chemin_vers_le_script/nom_script
c'est bien pratique ... !
La commande tar, que tu connais déjà, permet d'archiver plusieurs répertoire, en gardant les droits utilisateurs des
différents fichiers...
$ tar -cvf nom_de_l_archive.tar dir1 dir2 dir3 dir4 ... dirN
(elle ne sert à rien pour un seul fichier... puisque l'intérêt de cette fonction est de reproduire l'arborescence)
et derrière, la compression :
$ gzip -9 nom_de_l_archive.tar
Si tu veux que des programmes soient lancés au démarrage de ta machine, je peux t'expliquer comment procéder.
Attention, accroche toi, ça risque de ne pas te paraître très clair au début, mais si tu relis deux ou trois fois, tu finiras
bien par comprendre ;-)
Tout d'abord, il faut savoir qu'au démarrage ou à l'arrêt, la machine exécute la commande 'init', avec un numéro : 0
pour l'arrêt, 6 pour le redémarrage... Cette commande démarre ou stoppe l'ensemble des processus.
(Attention ! n'exécute pas cette commande ! Seul root a les droits pour la lancer, et tu risquerais d'éteindre ta
machine, ou de la rebooter !)
Le numéro correspond à l'ordre d'importance des processus lancés (du plus important, 0, au moins important, 6).
En fait, cette commande va lire le contenu de certains répertoires, se trouvant dans /etc/rc.d/ (pour la RedHat, je ne
sais pas si c'est le même pour la Mandrake, mais ça ne doit pas varier beaucoup).
Ces répertoires sont :
/etc/rc.d/rc0.d/
/etc/rc.d/rc1.d/
/etc/rc.d/rc2.d/
/etc/rc.d/rc3.d/
/etc/rc.d/rc4.d/
/etc/rc.d/rc5.d/
/etc/rc.d/rc6.d/
Un répertoire rc#.d contient des liens vers des fichiers. Ces liens ont des noms de la forme 'S##nom_fichier' ou
'K##nom_fichier', et ils pointent vers le script 'nom_fichier' contenu dans le répertoire /etc/rc.d/init.d/. Ce script prend
un paramètre qui peut être 'start' ou 'stop' (pour lancer ou arrêter le processus).
Selon que le lien commence par un S ou un K, il sera appelé par la commande init pour démarrer (S pour Start) ou
arrêter (K pour Kill) le processus.
Ca va toujours jusque là ?
Le numéro du répertoire /etc/rc.d/rc#.d correspond à l'ordre d'importance du processus. La commande
$ init 0
aura pour effet d'exécuter les commandes contenues dans le répertoire rc0.d
$ init 3
--> rc3.d
et, tu l'auras compris,
>$ init 6
--> rc6.d
Donc, récapitulons, les liens des répertoires /etc/rc.d/rc#.d/ pointent vers des scripts du répertoire /etc/rc.d/init.d/, et
sont appelés par la commande init #, qui exécute les commandes contenues dans les répertoires dont le numéro est
compris entre 0 et #.
C'est clair ?
Bon, tu me diras : "c'est bien beau, tout ça, mais comment je fais pour lancer automatiquement une commande au
démarrage ?", et là je te répondrai : "si tu as suivi (et compris), rien de plus simple ..."
Tu crées un script (ou un lien vers un script), qui prend comme paramètre 'start' ou 'stop', dans le répertoire
/etc/rc.d/init.d/. Tu crées deux liens vers ce script dans /etc/rc.d/rc3.d (pas dans rc0.d, rc1.d ou rc2.d, car il risquerait
de manquer des processus nécessaires au lancement du script) : 'S##nom_du_lien', et 'K##nom_du_lien'. (##
correspond à l'ordre d'importance. Un conseil, donne lui le numéro le plus élevé, soit 99. Si 99 est déjà pris, tu peux
lui donner le numéro 991, et ainsi de suite, pour être sûr qu'il soit exécuté en dernier au démarrage... )
Une fois ces liens créés, tu as fini, et Ô joie, quand tu redémarreras ta machine, tu constateras que le processus a été
lancé ;-)
Donc, je récapitule une dernière fois, avec un exemple, pour être sûr que tu as bien compris. Imaginons que j'aie un
programme qui s'appelle toto dans les répertoire /usr/local/prog/toto.
Je veux qu'il se lance au démarrage. Je commence donc par créer un script comme celui ci-dessous, que j'appelle
/usr/local/prog/truc :
#!/usr/bin/sh
case $1 in
start) echo "démarrage de toto"
/usr/local/prog/toto;;
stop) echo "arrêt de toto"
kill -TERM `cat /usr/local/prog/toto.pid`;;
# /usr/local/prog/toto.pid est le fichier sensé contenir le
# numéro de processus du programme, numéro qui lui a été
# attribué par le système lorsqu'on l'a lancé
*) echo "Usage : $0 {start|stop}";;
esac
Je rends mon script exécutable :
$ chmod +x /usr/local/prog/truc
Je crée un lien vers le script dans /etc/rc.d/init.d (là, je dois être sous root)
$ ln -s /usr/local/prog/truc /etc/rc.d/init.d/lien_truc
(j'aurais pu me contenter de créer directement le script dans /etc/rc.d/init.d/, mais c'est plus "propre" de travailler avec
des liens)
Je crée maintenant les liens dans /etc/rc.d/rc3.d
$ ln -s /etc/rc.d/init.d/lien_truc /etc/rc.d/rc3.d/S991truc
$ ln -s /etc/rc.d/init.d/lien_truc /etc/rc.d/rc3.d/K991truc
Et voilà, le tour est joué ;-)
Alors, c'était pas la mort, si ?
Un autre truc utile, puisque tu connais le principe du pipe |, c'est le "node" (noeud). C'est une espèce de fichier qui
ne contient rien du tout, mais que tu peux remplir momentanément. Ca a l'air compliqué, mais c'est simple :
$ mknot nom_de_mon-noeud p
crée un node de type pipe... c'est donc un pipe "en puissance", tu peux l'appeler pour faire passer un flux à travers ...
cela t'évite par exemple de créer momentanément un fichier, pour éviter de gaspiller de la mémoire ...
Prenons par exemple ta commande pour créer des mp3 :
$ cdparanoia -w numero_de_la_piste_à_extraire
$ lame numero_de_la_piste_extraite.wav nom_du morceau.mp3
tu crées d'abord un wave en entier(qui prend quand même pas mal de place, et du temps), puis tu crées un mp3
derrière, et ensuite il te faut supprimer le wave. Moralité : tu perds de l'espace et du temps.
Avec le node, tu n'as plus ce problème ...
Tu crées ton node
$ mknod num_piste.wav p
$ cdparanoia -w num_piste > num_piste.wav &
(n'oublie pas le & !!)
$ lame num_piste.wav nom_morceau.mp3
Il ne faut surtout pas oublier le &, car le node fonctionne de la façon suivante : Quand tu le crées, il est inactif, mais
dès que tu lui envoies quelque chose ( par la redirection > de la commande cdparanoia), il se bloque jusquèà ce qu'on
le lise ... En fait c'est le principe d'un tuyau ... tu as ouvert l'entrée, mais pas encore la sortie, alors tant qu'il reste
bouché d'un côté, tu es bloqué. Le & permet de donner son autonomie au processus, et de reprendre la main dans la
console. Si tu ne le mettais pas, il te faidrait lancer la deuxième commande dans une autre console... Une fois cette
deuxième commande lancée, la sortie du tuyau est bouchée, et au lieu de passer par un fichier intermédiaire (le
wave), le résultat de cdparanoia ets directement envoyé à lame... C'est le principe du flux tendu, quoi ...
après, tu peux te créer un script, qui crée lui-même ton mp3 :
#!/usr/bin/sh
if [ $ # -ne 2 ] then
mknod .$1.wav p
cdparanoia -w $1 > .$1.wav &
lame .$1 $2
rm -f .$1.wav
else
echo "Usage : $0 num_piste nom_fichier_mp3"
fi
Merci à lui ! La mise en forme n'est pas encore faite pour cette longue suite d'astuces !

![]() |
![]() |