Ceci fait suite à cette question .
J'ai exécuté quelques tests supplémentaires; il semble que cela n'a pas vraiment d'importance si cela se fait sur la console physique ou via SSH, cela ne se produit pas uniquement avec SCP; Je l'ai également testé avec cat /dev/zero > /dev/null
. Le comportement est exactement le même:
- Démarrez un processus en arrière-plan en utilisant
&
(ou mettez-le en arrière-plan après qu'il a commencé à utiliserCTRL-Z
etbg
); cela se fait sans utilisernohup
. - Se déconnecter.
- Connectez-vous à nouveau.
- Le processus est toujours là, se déroule joyeusement et est maintenant un enfant direct de
init
.
Je peux confirmer à la fois SCP et CAT quitte immédiatement si envoyé un SIGHUP
; J'ai testé cela en utilisant kill -HUP
.
Ainsi, il semble vraiment que SIGHUP ne soit pas envoyé à la déconnexion, du moins aux processus d'arrière-plan (ne peut pas tester avec un premier plan pour des raisons évidentes).
Cela m'est arrivé initialement avec la console de service de VMware ESX 3.5 (qui est basée sur RedHat), mais j'ai pu la répliquer exactement sur CentOS 5.4.
La question est, encore une fois: un SIGHUP ne devrait-il pas être envoyé aux processus, même s'ils s'exécutent en arrière-plan, lors de la déconnexion? Pourquoi cela ne se produit-il pas?
Éditer
J'ai vérifié avec strace
, selon la réponse de Kyle.
Comme je m'y attendais, le processus ne reçoit aucun signal lors de la déconnexion du shell où il a été lancé. Cela se produit à la fois lors de l'utilisation de la console du serveur et via SSH.
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=10676, si_uid=3000090} --- rt_sigreturn() = -1 EINTR (Interrupted system call) rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=13944, si_uid=3000090} --- +++ killed by SIGHUP +++
huponexit
.Réponses:
Réponse trouvée.
Pour BASH, cela dépend de l'
huponexit
option shell, qui peut être affichée et / ou définie à l'aide de lashopt
commande intégrée .Il semble que cette option soit désactivée par défaut, au moins sur les systèmes basés sur RedHat.
Plus d'informations sur la page de manuel BASH :
la source
Il sera envoyé SIGHUP dans mes tests:
Shell1:
Shell2:
Shell1 à nouveau:
Shell2 à nouveau :
Pourquoi fonctionne-t-il toujours?:
Advanced Programing in the Unix Environment by Stevens couvre ceci dans la section 9.10: Orphaned Process Groups. La section la plus pertinente étant:
la source
$ strace -e signal -p1705 Process 1705 attached --- stopped by SIGTSTP --- --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=791, si_uid=3000090} --- +++ killed by SIGTERM +++
Odd, certainement pas en accord avec la section citée de Stevens.J'ai exécuté quelques tests en utilisant CentOS 7.1 et bash. Notez que ce moyen
huponexit
estoff
par défaut, et était désactivé pour la majorité de mes tests.Vous en avez besoin
nohup
lorsque vous démarrez un travail dans un terminal, car si vous fermez ce terminal sans quitter proprement le shell , le terminal envoie bash le signal SIGHUP au shell, qui l'envoie ensuite à tous les enfants. Si vous quittez le shell proprement - ce qui signifie que le travail doit déjà être en arrière-plan afin que vous puissiez taperexit
ou appuyer sur Control-D à l'invite de commande - aucun signal d'aucune sorte n'est envoyé au travail en arrière-plan à partir de bash.Tester:
Terminal 1
Terminal 2
(fermer la borne 1, vue dans la borne 2):
Emploi
doit.sh
:Démarrez-le en arrière-plan dans le terminal 1:
Terminal 1
Strace dans le Terminal 2; fermez le terminal 1 après quelques boucles:
Terminal 2
Sortie dans le terminal 3:
Terminal 3
Cependant, si vous sortez
bash
, il se ferme simplement sans envoyer de signal à l'enfant. Le terminal se fermera car il n'a plus d'enfant, mais bien sûr il n'y a personne pour HUP car le shell enfant est déjà parti. LeSIGINT
,SIG_BLOCK
etSIG_SETMASK
vous voyez ci-dessous sont dus àsleep
la coquille.Terminal 1
Terminal 2
Borne 3, sortie
Fait intéressant, je me suis mis
huponexit
enshopt -s huponexit; shopt
route avec (ce dernier shopt à revoir), puis j'ai effectué le dernier test, et encore bash n'a envoyé aucun signal au processus d'arrière-plan . Encore plus intéressant, comme nous l'avons vu, bash a envoyé le signal au processus d'arrière-plan après l'avoir reçu d'un terminal qui s'est fermé en face. Il semble que cela n'aithuponexit
eu aucune incidence dans un sens ou dans l'autre.J'espère que cela supprime tout mystère ou confusion concernant au moins la bêtise de bash, sur quand et comment le signal HUP est envoyé. Au moins, mes tests étaient complètement reproductibles, pour moi. Je serais intéressé de savoir s'il existe d'autres paramètres susceptibles d'affecter le comportement de bash.
Et, comme toujours, YSMV (Your Shell May Vary).
Addendum 1
Lorsque j'exécute un shell en tant que
exec /bin/sh
, puis exécute le script en tant que/bin/sh ./doit.sh &
, puis quitte correctement le shell, aucun signal n'est envoyé au travail d'arrière-plan et il continue de s'exécuter jusqu'à la fin.Addendum 2
Lorsque j'exécute un shell en tant que
exec /bin/csh
, puis exécute le script en tant que/bin/sh ./doit.sh &
, puis quitte correctement le shell, aucun signal n'est envoyé au travail d'arrière-plan et il continue de s'exécuter jusqu'à la fin.la source
J'utilise csh et les processus d'arrière-plan continuent de fonctionner lorsque je me déconnecte.
la source