(Courriels de diversion: <narrees@prudente-dateront.com> <humanite@professeurs-delegueriez.com> <superdividende@pivert-numeroteriez.com> <vouerais@suppliciee-incriminerent.com> <arrangions@diarrhees-enfantements.com> <caracteres@immiscerez-rechaufferas.com> <fourrerons@immeuble-controleras.com> <remplacons@deshabituee-derivez.com> <feodale@combattes-identifia.com> <lingerie@ambulantes-enumereraient.com> )


>>>>> "jdd" == jdd  <jdanield@dodin.net> writes:
  jdd> j'avais cru comprendre que nohup ou & (ou les deux ensemble),
  jdd> en mettant une tâche en fond permettait de quitter (déloguer)
  jdd> un terminal sans interrompre l'appli.

Lorsqu'on se logue sur un système Unix, le système nous alloue un
terminal (limitons nous aux intéractions en mode texte pour l'instant:
connexion depuis une des consoles virtuelles ou par ssh). Ce terminal
maître est un attribut du processus shell, qui est hérité par les fils
du shell. Quand je tape ps, par exemple

,----
| % ps -f
| UID        PID  PPID  C STIME TTY          TIME CMD
| emarsden 19108 19107  0 Apr07 pts/0    00:00:00 -zsh
| emarsden 14923 19108  0 13:15 pts/0    00:00:00 ps -f
`----

je vois que le père 19108 et le fils 14923 partagent le même terminal
nommé pts/0. L'accès au terminal maître est contrôle: un fils qui
s'exécute en arrière plan ne peut pas y lire ou écrire; il est
suspendu jusqu'à ce qu'il revienne en premier plan et redevienne ainsi
propriétaire du terminal:

,----
| % emacs -nw &
| [1] 14937
| %
| [1]  + suspended (tty output)  emacs -nw
| % fg
| [1]  + continued  emacs -nw
`----

Lorsqu'on se déconnecte de notre système Unix, le terminal qui nous
avait été alloué est libéré. Les fils en arrière plan sont informés du
fait que leur terminal maître va disparaître par la réception d'un
signal HUP (hangup on controlling terminal). Ils peuvent alors décider
de quitter (c'est le comportement par défaut), ou de continuer sans
accès à leur terminal. La commande "nohup" permet d'exécuter une
application en redirigeant sa sortie standard + erreur vers un
fichier, et de telle sorte qu'elle ne quittera pas en recevant le
signal HUP. On peut faire pareil a postieri en utilisant

   disown -h %1

pour dissocier le job numéro 1 (on connaît les numéros grâce à la
commande "jobs") du terminal maître.


  [Tout ceci est compliqué par le fait que la notion de terminal
   maître a été partiellement remplacée dans la norme POSIX par la
   notion de session ou de groupe de processus, et que les shells ne
   gèrent pas toutes les sessions de la même manière.]


La différence de comportement entre xterm et rxvt semble être ce
qu'ils font lorsqu'on ferme brutalement leur fenêtre: le premier
laisse le temps au shell de gérer la fermeture de la session
(probablement en lui envoyant un SIGTERM), alors que rxvt semble
mourir immédiatement, tuant ainsi le shell, qui n'a pas l'occasion de
fermer la session. 
     
-- 
Eric Marsden                          <URL:http://www.laas.fr/~emarsden/>

--------------------------------------------------------------------
Les listes de diffusion occultes: <URL:http://www.CULTe.org/listes/>