Arrière plan

Publié le par Peck

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 :
#!/bin/sh
/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 { }

Publié dans admin

Commenter cet article