Arrière plan
Maintenant sur http://linux-attitude.fr/post/Arriere-plan
Niveau:
Résumé: bash fork & exec
Supposons que vous ayez un script que vous voulez faire tourner en arrière plan. Par exemple un script d'init qui s'obstine à vous bloquer le processus de boot alors que vous savez pertinemment que sa terminaison n'est pas indispensable à la suite du processus (c'est un exemple).
Comment faire ceci simplement ?
Méthode 1 : vous créez un script stub
Écrivez un deuxième script exécutable qui sera appelé à la place du premier et contenant :
Inconvénient, vous avez maintenant 2 scripts à gérer et il vous faut changer soit le nom du script original, soit les chemins d'appels. De plus votre 2e script dépend du chemin du premier.
Méthode 2 : vous "démonisez" votre script
Et c'est maintenant que bison futé fait son apparition. L'expérience a fait de bison futé un bison rôdé à toutes les ornières de la route du sysadmin bienheureux.
Voici donc la ligne miracle à déposer en début du script à lancer en arrière plan :
Explications :
Niveau:
Résumé: bash fork & exec
Supposons que vous ayez un script que vous voulez faire tourner en arrière plan. Par exemple un script d'init qui s'obstine à vous bloquer le processus de boot alors que vous savez pertinemment que sa terminaison n'est pas indispensable à la suite du processus (c'est un exemple).
Comment faire ceci simplement ?
Méthode 1 : vous créez un script stub
Écrivez un deuxième script exécutable qui sera appelé à la place du premier et contenant :
#!/bin/sh
/votre/script "$@" &
/votre/script "$@" &
Inconvénient, vous avez maintenant 2 scripts à gérer et il vous faut changer soit le nom du script original, soit les chemins d'appels. De plus votre 2e script dépend du chemin du premier.
Méthode 2 : vous "démonisez" votre script
Et c'est maintenant que bison futé fait son apparition. L'expérience a fait de bison futé un bison rôdé à toutes les ornières de la route du sysadmin bienheureux.
Voici donc la ligne miracle à déposer en début du script à lancer en arrière plan :
[ -z "$FORK" ] && { FORK=1 $0 "$@" & exit; }
Explications :
- [ ] -> lance un test
- -z -> la chaine à tester est vide (pas encore de fork)
- && -> éqivalent du if, si ce qui est à gauche est vrai on continue l'évaluation
- { } -> groupe de sous commandes sans sous shell
- FORK=1 -> variable d'environnement (car juste avant une commande)
- $0 -> exécute le script dans lequel on est (-> avec FORK à 1 -> false pour le test initial)
- "$@" -> passe en argument au script exactement ceux qu'on vient de recevoir correctement séparés par des " (pour les espaces)
- & -> lance la commande prédédente en arrière plan, pas besoin de ; après &
- exit -> arrête définitivement le script en cours (le père)
- ; -> indispensable à la fin de { }