Bonjour à tous,
S'ils vous plaît est ce que quelqu'un peut m'expliquer pourquoi on utilise les traps en programmation shell, et comment les utiliser dans un script.
Cordialement
-----
Bonjour à tous,
S'ils vous plaît est ce que quelqu'un peut m'expliquer pourquoi on utilise les traps en programmation shell, et comment les utiliser dans un script.
Cordialement
trap permet de positionner une action à la réception d'un "signal"
enfin, quand c'est possible, car il y a des signaux mortels qu'on ne peut pas intercepter, comme il y en a qu'on peut intercepter mais pas détourner (on peut juste faire son testament avant de mourir ).
on peut déclencher un signal sur un process, soit par des actions clavier (crtl-c, ctrl-d, ...) soit par une commande de la grande famille kill depuis un autre process du système.
il y a même 2 signaux dédiés à l'utilisateur: SIGUSR1 et SIGUSR2, c'est l'utilisateur qui en défini l'origine et l'utilisation... (par exemple, SIGUSR1 est utilisé par dd pour faire afficher l'état d'avancement de la copie)
exemple, si on ne veut pas être "dérangé" par un ctrl-c, on peut donc positionner un trap (piège) sur ce signal (et ensuite pour tuer le process, il faut ruser...).
lecture indispensable:
man man
. (utiliser les commandes habituelles de less ou more)
. vous ne connaissez pas less ou more (more, c'est l'ancien "pager", less est le nouveau. le pager, c'est le truc qui affiche page par page un long texte avec des possibilités en plus):
man less
. (utiliser entrée pour avancer d'une ligne, espace pour avancer d'une page, et lisez bien, car c'est utilisé partout ! ! !)
man bash
. (ou man sh ou autre, selon le shell qu'on utilise).
. chercher trap (taper /: ça ouvre une ligne de recherche, entre 3 espaces puis trap ( trap) pour arriver direct au bon chapitre.
man 7 signal
. donne tout un tas d'info sur les signaux, le plus important ici, c'est la liste des signaux avec le numéro (utilisable jusqu’au n°15, c'est le souc après...), le nom, la fonction et s'il peut être capturé (partiellement (cf testament plus haut) ou totalement).
notez le 7 de la commande ci-dessus: indique la section dans laquelle on veut chercher, elle est ensuite indiquée en première page, toujours la vérifier, car il y a parfois la même entrée dans différentes sections...
le truc important dans man, c'est le chapitre "see also" ou "voir aussi"... ça permet d'apprendre le nom des éléments voisins...
par exemple, si jon avait fait man signal, il aurait probablement ouvert dans la section 2 (appel système), mais au bout, dans le chapitre SEE ALSO, on aurait trouvé signal(7) et la personne curieuse aurait fait man 7 signal...
autre truc important dans man: parfois la version française est peu parlante, ajouter la la directive LANG=C devant la commande:
LANG=C man man
un peu de lecture:
man kill
man pkill
...
man ps
man pgrep
...
Et tout ça sans internet ! ! !
(bon, il faut quand même que les pages man soient installées: paquets manpages, manpages-dev sous linux)
Jusqu'ici tout va bien...
Bonjour
On utilise trap pour intercepter des signaux du système et exécuter une ou plusieurs commandes lorsqu'ils sont émis.
Les paramètres à fournir la commande trap sont :
- une commande, pouvant faire appel à des fonctions ou à des expressions complexes,
- le ou les numéros de signaux provoquant son exécution.
Par exemple « trap 'echo "... Interception !"; pwd' 2 3 6 ».
En indiquent « - » à la place de la commande, l'interception des signaux spécifiés est annulée.
La liste des numéros de signaux disponibles est donnée par la commande « trap -l ».
La liste des interceptions réalisées est donnée par la commande « trap -p » (ou plus simplement « trap »).
Par exemple, voici un script qui intercepte le signal SIGINT (numéro 2), produit par la combinaison de touches Ctrl+C (break). [NB: la production des signaux pouvant différer d'un système à l'autre, il est possible que cet exemple nécessite d'intercepter le signal SIGQUIT (numéro 3).]
Le script affiche un décompte depuis 20.Code:#!/bin/sh INTtrap() { echo " appelle la fonction INTtrap()" } T=20 trap INTtrap 2 while [ $T -ne 14 ]; do echo $T sleep 1 let T=T-1 done trap 'echo " commande echo T="$T' 2 while [ $T -ne 7 ]; do echo $T sleep 1 let T=T-1 done trap - 2 while [ $T -ne 0 ]; do echo $T sleep 1 let T=T-1 done echo "- Bye ! -"
Entre 20 et 14, l'appui sur Ctrl+C provoque l'appel de la fonction INTtrap().
Entre 14 et 7, l'appui sur Ctrl+C provoque l'exécution de la commande « echo " commande echo T="$T ».
Entre 7 et 0, l'appui sur Ctrl+C provoque l'interruption normale du script.
Voici un exemple de résultat affiché sur la console :
MyMac:~ tester$ ./test.sh
20
19
^C appelle la fonction INTtrap()
18
17
^C appelle la fonction INTtrap()
16
15
14
^C commande echo T=14
13
12
^C commande echo T=12
11
10
^C commande echo T=10
9
8
7
^C
MyMac:~ tester$
merci pour vos réponses