Poser cette question après une longue discussion avec un collègue, je voudrais vraiment une clarification ici.
Je lance un processus d'arrière-plan, soit en ajoutant " &
" à la ligne de commande, soit en l'arrêtant CTRL-Z
et en le reprenant en arrière-plan avec " bg
". Ensuite, je me déconnecte.
Ce qui se produit?
Nous étions sûrs qu'il aurait dû être tué par un SIGHUP, mais cela ne s'est pas produit; lors de la reconnexion, le processus était en cours d'exécution et a pstree
montré qu'il était "adopté" par init
.
Est-ce le comportement attendu?
Mais alors, si c'est le cas, quel est le nohup
but de la commande? Il semble que le processus ne sera pas tué de toute façon, avec ou sans lui ...
Modifier 1
Quelques détails supplémentaires:
- La commande a été lancée à partir d'une session SSH, pas à partir de la console physique.
- La commande a été lancée sans
nohup
et / ou&
; il a ensuite été suspendu avecCTRL-Z
et repris en arrière-plan avecbg
. - La session ssh n'a pas chuté. Il y a eu une déconnexion réelle (
exit
commande " "). - Le processus était une
scp
opération de copie de fichiers. - Lorsque vous vous reconnectez,
pstree
le processus est en cours d'exécution et est enfant deinit
.
Modifier 2
Pour énoncer plus clairement la question: mettre un processus en arrière-plan (en utilisant &
ou bg
) le fera-t-il ignorer SIGHUP
, tout comme la nohup
commande?
Modifier 3
J'ai essayé d'envoyer manuellement un SIGHUP
à scp
: il s'est arrêté, donc il n'ignore certainement pas le signal.
Ensuite, j'ai essayé de nouveau de le lancer, de le mettre en arrière-plan et de me déconnecter: il a été "adopté" par init
et a continué à fonctionner, et je l'ai trouvé là lors de la reconnexion.
Je suis assez perplexe maintenant. On dirait que non a SIGHUP
été envoyé du tout jusqu'à la fermeture de session.
la source
1>/dev/null 2>&1
pour bash, etc.?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
Je suis d'accord avec Warner et je veux juste ajouter que vous pouvez empêcher le shell d'envoyer SIGHUP avec la commande "disown" intégrée. La page de manuel bash contient une bonne description.
la source
Vous pouvez utiliser la commande nohup pour lancer la commande et rediriger la sortie dans un fichier de sortie nohup. Depuis la page de manuel de nohup:
L'autre option consiste à utiliser la commande d' écran . L'avantage de l'utilisation de l'écran est que vous pouvez vous reconnecter au processus ultérieurement.
la source
Lorsque vous forkez un processus en arrière-plan, il s'agit toujours du processus enfant du shell qui l'exécute.
Tous les processus enfants exécutés sous un shell reçoivent un SIGHUP à la sortie. Les performances varient légèrement en fonction de la situation exacte, qui est détaillée dans la page de manuel de bash. D'autres obus ont probablement des descriptions similaires.
Apache et d'autres démons rechargent généralement la configuration sur SIGHUP. Les utilitaires de l'espace utilisateur meurent souvent. Les performances de l'application liées aux signaux peuvent être uniques à l'application.
la source
Quel a été le processus? Les performances décrites dans la publication précédente 1 étaient exactes.
Certaines fonctions et processus de script peuvent intercepter des signaux. tandis que les boucles peuvent s'enfuir comme des fous.
Voir:
Abandon de session SSH - La commande continue-t-elle de s'exécuter?
Modifier 1 à 16h22
Depuis la page de manuel bash:
La recherche initiale 1 montre qu'OpenSSH ignore probablement SIGHUP, peut-être plus de signaux.
la source
Si vous n'avez pas lancé la commande via un outil comme
screen
, alors à la fin de la session, faites tous les travaux / tâches associés à cette session.la source
tail -f
le fichier temporaire. Ceci sur une machine CentOS 7.1 utilisant bash.