Guide avancé d'écriture des scripts Bash: | ||
---|---|---|
Précédent | Chapitre 11. Commandes internes et intégrées | Suivant |
Certaines des commandes de contrôle de jobs prennent en argument un << identifiant de job (job identifier) >> Voir la table à la fin de ce chapitre.
Liste les jobs lançés en tâche de fond, en indiquant le numéro de job. Pas aussi utile que ps.
![]() | Il est trop facile de confondre les jobs et les processus. Certaines commandes intégrées, telles que kill, disown et wait acceptent soit un numéro de job soit un numéro de processus comme argument. Les commandes fg, bg et jobs acceptent seulement un numéro de job.
<< 1 >> est le numéro de job (les jobs sont maintenus par le shell courant), et << 1384 >> est le numéro de processus (les processus sont maintenus par le système). Pour tuer ce job/processus, faites soit un kill %1 soit un kill 1384. Merci, S.C. |
Supprime le(s) job(s) de la table du shell des jobs actifs.
La commande fg fait basculer un job, qui tournait en tâche de fond, en avant-plan. La commande bg relance un job suspendu en tâche de fond. Si aucun numéro de job n'est spécifié, alors la commande fg ou bg agit sur le job en cours d'exécution.
Arrête l'exécution du script jusqu'à ce que tous les jobs en tâche de fond aient terminé, ou jusqu'à ce que le numéro de job ou l'idendifiant de processus spécifié en option termine. Retourne l'état de sortie de la commande attendue.
Vous pouvez utiliser la commande wait pour empêcher un script de se terminer avant qu'un job en arrière-plan ne finisse son exécution (ceci créerait un processus orphelin).
Exemple 11-22. Attendre la fin d'un processus avant de continuer
#!/bin/bash ROOT_UID=0 # Seulement les utilisateurs ayant $UID 0 ont les privilèges de # root. E_NONROOT=65 E_SANSPARAM=66 if [ "$UID" -ne "$ROOT_UID" ] then echo "Vous devez être root pour exécuter ce script." # "Passe ton chemin gamin, il est temps d'aller au lit." exit $E_NONROOT fi if [ -z "$1" ] then echo "Usage: `basename $0` chaine-find" exit $E_SANSPARAM fi echo "Mise à jour de la base 'locate'..." echo "Ceci peut prendre du temps." updatedb /usr & # Doit être lancé en tant que root. wait # Ne pas lancez le reste du script jusqu'à ce que 'updatedb' finisse. # La base de données doit être mise à jour avant de chercher quelque chose. locate $1 # Sans la commande wait, avec le pire scénario, le script sortirait alors que # 'updatedb' serait toujours en cours d'exécution, le laissant orphelin. exit 0 |
Optionnellement, wait peut prendre un identifiant de job en tant qu'argument, par exemple, wait%1 ou wait $PPID. Voir la table des identifiants de job.
![]() | A l'intérieur d'un script, lancer une commande en arrière-plan avec un "et commercial" (&) peut faire que le script se bloque jusqu'à un appui sur la touche ENTER. Ceci semble arriver avec les commandes qui écrivent sur stdout. Cela peut être un gros problème.
Placer un wait après la commande de tâche de fond semble remédier à ceci.
|
Ceci a un effet similaire à Controle-Z, mais cela suspend le shell (le processus père du shell devrait le relancer à un moment approprié).
Sort d'un login shell, quelque fois en spécifiant un état de sortie.
Donne des statistiques sur le temps système utilisé pour l'exécution des commandes, de la façon suivante:
0m0.020s 0m0.020s |
Force la fin d'un processus en lui envoyant le signal de terminaison approprié (voir Exemple 13-4).
Exemple 11-23. Un script qui se tue lui-même
#!/bin/bash # self-destruct.sh kill $$ # Le script tue son propre processus ici. # Rappelez-vous que "$$" est le PID du script. echo "Cette ligne ne s'affichera pas." # A la place, le shell envoie un message "Terminated" sur stdout. exit 0 # Après que le script se soit terminé prématurément, #+ quel code de sortie retourne-t'il? # # sh self-destruct.sh # echo $? # 143 # # 143 = 128 + 15 # sgnale TERM |
![]() | kill -l liste tous les signaux. Un kill -9 est une << mort certaine >>, qui terminera un processus qui obstinément refuse de mourir avec un simple kill. Quelque fois, un kill -15 fonctionne. Un << processus zombie >>, c'est-à-dire un processus dont le père est mort, ne peut être tué (vous ne pouvez pas tuer quelque chose qui est déjà mort), mais init nettoiera habituellement cela plus ou moins tôt. |
La directive command COMMANDE désactive les alias et les fonctions pour la commande << COMMANDE >>.
![]() | C'est une des trois directives qui effectuent le traitement de commandes de script. Les autres sont des commandes intégrées et activées. |
Appeler builtin COMMANDE_INTEGREE lance la commande << COMMANDE_INTEGREE >> en tant que commande intégrée du shell, désactivant temporairement à la fois les fonctions et les commandes externes du système disposant du même nom.
Ceci active ou désactive une commande intégrée du shell. Comme exemple, enable -n kill désactive la commande intégrée kill, de façon à ce que, quand Bash rencontre kill, il appelle /bin/kill.
L'option -a d'enable liste toutes les commandes intégrées du shell, indiquant si elles sont ou non activées. L'option -f nomfichier permet à enable de charger une commande intégrée en tant que module de bibliothèque partagée (DLL) à partir d'un fichier objet correctment compilé. [1].
Ceci est un port pour Bash du chargeur automatique de ksh. Avec autoload en place, une fonction avec une déclaration << autoload >> chargera à partir d'un fichier externe à sa première invocation. [2] Ceci sauve des ressources système.
Notez qu'autoload ne fait pas partie de l'installation de base de Bash. Il a besoin d'être chargé avec enable -f (voir ci-dessus).
Tableau 11-1. Identifiants de jobs
Notation | Signification |
---|---|
%N | Numéro de job [N] |
%S | Appel (ligne de commande) de jobs commençant par la chaîne de caractères S |
%?S | Appel (ligne de commande) of jobs contenant en soi la chaîne de caractères S |
%% | Job << courant >> (dernier job arrêté en avant-plan ou lancé en tâche de fond) |
%+ | Job << courant >> (dernier job arrêté en avant-plan ou lancé en tâche de fond) |
%- | Dernier job |
$! | Dernier processus en tâche de fond |
[1] | Le source C pour un certain nombre de commandes intégrées chargeables est disponible typiquement dans le répertoire /usr/share/doc/bash-?.??/functions. Notez que l'option -f d'enable n'est pas transportable sur tous les systèmes. |
[2] | Le même effet qu'autoload peut être réalisé avec typeset -fu. |
Précédent | Sommaire | Suivant |
Commandes internes et intégrées | Niveau supérieur | Filtres externes, programmes et commandes |