traps en shell
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

traps en shell



  1. #1
    invite75c2964e

    traps en shell


    ------

    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

    -----

  2. #2
    polo974

    Re : traps en shell

    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...

  3. #3
    invite936c567e

    Re : traps en shell

    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).]

    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 ! -"
    Le script affiche un décompte depuis 20.
    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$

  4. #4
    invite75c2964e

    Re : traps en shell

    merci pour vos réponses

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Scripts shell
    Par invitee60de0cf dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 14/01/2016, 13h27
  2. Script Shell
    Par inviteb985377e dans le forum Programmation et langages, Algorithmique
    Réponses: 19
    Dernier message: 22/07/2015, 17h22
  3. Shell-éco
    Par _Goel_ dans le forum Technologies
    Réponses: 1
    Dernier message: 12/04/2007, 19h05
  4. shell.dll
    Par eklipse dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 06/01/2005, 00h04
  5. shell ksh
    Par invitefb4c4860 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 24/03/2004, 10h57