next up previous contents Next: Tuer un processus avec Up: Processus et variables d'environnement. Previous: Contrôle des tâches.   Table des matières  

10.4 Création de processus en arrière-plan.

Créons, à présent, un programme qui fait quelque chose d'un peu plus intéressant:

#!/bin/sh 

echo "proc.sh: en cours"

while true; do

        echo -e '\a'

        sleep 2

done 



A présent, faisons ^Z, bg, fg et ^C comme précédemment. Si vous souhaitez mettre un processus en arrière-plan dès son exécution, vous utiliserez:

./proc.sh & 


La section ``CONTROLE DES JOBS'' (JOB CONTROL) de la page de man de bash (bash(1)) ressemble à ceci [Merci à Brian Fox et à Chet Raney pour ces données (annotation de P. Sheer)]:

CONTROLE DES TACHES [NdT: concernant la traduction française, le texte est très largement inspiré de la page de man bash dont la traduction a été réalisée par Christophe Blaess en 1997 (cette traduction a été réactualisée par Thierry Vigneaud en 1999-2001).]

Le contrôle des tâches est la capacité à arrêter de manière sélective (suspend) l'exécution des processus et à en continuer l'exécution (resume) ultérieurement. Un utilisateur emploie typiquement cette fonctionnalité via une interface interactive fournie par le pilote de terminal du système et le bash.

L'interpréteur (shell) associe unjob à chaque tube [Qu'est-ce que cela signifie? Simplement que chaque fois qu'une commande, un programme ou un script est exécuté en arrière-plan, un nombre unique, appelé numéro de tâche, lui est attribué]. L'interpréteur maintient une table des tâches en cours d'exécution, cette table pouvant être affichée avec la commande jobs. Quand bash lance une tâche de manière asynchrone (c'est-à-dire en arrière-plan), il imprime une ligne du genre:

[1] 25647

indiquant que la tâche est associée à un numéro valant 1 et que le PID du dernier processus dans le tube est 25647. Tous les processus dans un tube simplefont partie du même processus. Le bash utilise la notion de tâche (ou job) comme une abstraction pour aider à les contrôler.

Pour faciliter l'implantation d'une interface utilisateur pour le contrôle des tâches, le système introduit la notion d'ID de groupe de processus associés au terminal courant. Les membres de ce groupe de processus (ceux dont le GID est égal au process group ID du terminal courant) reçoivent des signaux produits par le clavier tels que SIGINT. Ces processus sont dits en avant-plan. Les processus en arrière-plan sont ceux dont le GID de processus diffère de celui du terminal; de tels processus sont protégés des signaux produits par le clavier. Seuls les processus en avant-plan peuvent lire à partir du terminal et y écrire. Les processus en arrière-plan qui tentent de lire à partir du terminal ou d'y écrire reçoivent un signal SIGTTIN (ouSIGTTOU) par le pilote de périphérique du terminal qui, sauf interception du signal (saisie), suspend le processus.

Si le système d'exploitation sur lequelbash est en cours, permet le contrôle des tâches, bash vous permettra l'accès. La saisie du caractère suspend (soit ^Z ou Ctrl-Z) pendant l'exécution du processus, provoque l'arrêt du processus et vous ramène dans le bash. La frappe du caractère de suspension différée (typiquement ^Y ou Crtl-Y) arrêtera le processus lorsqu'il tentera de lire depuis le terminal. Le contrôle reviendra à bash. Vous pourrez alors manipuler l'état de la tâche en utilisant la commandebg de manière à la relancer en arrière-plan, la commande fg pour mettre la tâche en avant-plan ou la commande kill pour tuer le processus. Un ^Z prend effet immédiatement et a pour effet corollaire de provoquer une sortie immédiate.

Il y a plusieurs méthodes pour désigner une tâche dans un shell. Le caractère % introduit un nom de tâche. Le numéro n de tâche peut être mentionné comme %n. Une tâche peut aussi être décrite en employant le préfixe du nom utilisé pour le démarrer ou en employant une sous-chaîne qui apparaît en ligne de commande. Par exemple, %ce se réfère à une tâche ce arrêtée. Si un préfixe correspond à plusieurs tâches, bash rapporte une erreur. Utiliser %?ce, en revanche, permet de désigner toute tâche contenant la chaîne ce dans la ligne de commande. Si la sous-chaîne correspond à plusieurs tâches, bash renvoie une erreur. Les symboles %% et %+ se rapportent au ``job'' de shell courant, qui est la dernière tâche arrêtée alors qu'elle était en avant-plan. La tâche précédente peut être mentionné en utilisant%-. Dans les affichages relatifs aux tâches (c'est-à-dire la sortie de la commande jobs), la tâche en cours est toujours indiqué avec un +, et celle qui la précède avec un -.

Il suffit de nommer une tâche pour la ramener en avant-plan: %1 est un synonyme pour ``fg %1'', ramenant la tâche 1 de l'arrière-plan vers l'avant-plan. De manière analogue, ``%1 &'' transfère la tâche 1 en arrière-plan, ce qui équivaut à ``bg %1''.

Le shell est immédiatement informé de tout changement d'état d'une tâche. Normalement, le bash attend jusqu'à ce qu'il soit prêt à afficher une invite avant de faire un rapport des modifications de status de tâche afin qu'il n'interrompe pas toute autre affichage. Si l'option -b de la commande set est activée, le bash affiche les modifications immédiatement. (Voir aussi la description de la variable notify dans les variables du shell, ci-dessus).

Si vous essayez de quitter le bash alors que des tâches sont suspendues, le shell affiche un message d'avertissement. Vous pouvez alors utiliser la commande jobs pour vérifier l'état des tâches. Si vous pratiquez de cette manière ou que vous essayez de sortir de suite, vous ne serez plus averti et les tâches suspendues seront définitivement terminées.


next up previous contents Next: Tuer un processus avec Up: Processus et variables d'environnement. Previous: Contrôle des tâches.   Table des matières  
1-01-2006