J'ai lu une réponse d'un utilisateur qui prétendait que courir
foo 2>&1 >& output.log &
entraînerait la foo
poursuite de l'exécution même lorsqu'ils se déconnectent. Selon cet utilisateur, cela a même fonctionné sur des connexions SSH.
Je ne croyais pas vraiment que, car j'avais l'impression qu'en cas de déconnexion de SSH ou de résiliation du TTY, le shell et donc ses processus recevraient un SIGHUP, ce qui les obligerait à se terminer. À mon avis, c'était la seule raison d'utiliser nohup
dans de tels cas, ou tmux
, screen
et al.
J'ai ensuite regardé dans le manuel de glibc :
Ce signal est également utilisé pour signaler la fin du processus de contrôle sur un terminal aux travaux associés à cette session; cette terminaison déconnecte efficacement tous les processus de la session du terminal de contrôle.
Cela semble confirmer mes pensées. Mais en regardant plus loin, il dit :
Si le processus est un leader de session qui a un terminal de contrôle, un signal SIGHUP est envoyé à chaque processus dans la tâche de premier plan, et le terminal de contrôle est dissocié de cette session.
Cela signifie-t-il donc que les emplois mis en arrière-plan ne recevront pas SIGHUP?
À ma plus grande confusion, j'ai exécuté une session Zsh interactive, exécuté yes >& /dev/null &
et tapé exit
, lorsque Zsh m'a averti que j'avais des travaux en cours et, après avoir tapé exit
une deuxième fois, m'a dit qu'il avait SIGHUPed un travail. Faire exactement la même chose dans Bash laisse le travail en cours…
logout
etyes
fonctionne toujours.Réponses:
Bash semble envoyer le
SIGHUP
seul s'il a reçu lui-même unSIGHUP
, ce qui se produit par exemple lorsqu'un terminal virtuel est fermé ou lorsque la connexion SSH est interrompue. De la documentation :Donc, si vous tapez
exit
ou appuyez sur Ctrl+, Dtout le processus d'arrière-plan restera, car cela n'envoie pas de signal de raccrochage au Bash.Vous pouvez forcer Bash à vous avertir du fait qu'il existe toujours des processus en arrière-plan avec
Il existe une option pour envoyer la
SIGHUP
sortie à la sortie si vous êtes dans un shell interactif ( voir ici ). Mais cela ne fonctionne pas sur ma machine avec Bash 4.2.25. Peut-être que cela fonctionne pour vousla source
SIGHUP
est envoyée, sinon, avec une sortie propre, les travaux continuent de s'exécuter? Cela explique ce que j'ai vu.huponexit
est "uniquement en vigueur pour les shells de connexion interactifs"