web-dev-qa-db-fra.com

Si je lance un processus d'arrière-plan et que je me déconnecte, continuera-t-il de s'exécuter?

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 ou en l'arrêtant avec CTRL-Z et le reprendre 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 pstree a montré qu'il était "adopté" par init.

Est-ce le comportement attendu?

Mais alors, si c'est le cas, quel est le but de la commande Nohup? 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 sansNohup et/ou &; il a ensuite été suspendu avec CTRL-Z et repris en arrière-plan avec bg.
  • La session ssh pas drop. Il y a eu une déconnexion réelle (commande "exit").
  • Le processus était une opération de copie de fichier scp.
  • En se reconnectant, pstree a montré que le processus était en cours d'exécution et qu'il était enfant de init.

Modifier 2

Pour énoncer plus clairement la question: mettre un processus en arrière-plan (en utilisant & ou bg) fait ignorer SIGHUP, tout comme la commande Nohup?


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é de fonctionner, et je l'ai trouvé là lors de la reconnexion.

Je suis assez perplexe maintenant. Il semble qu'aucun SIGHUP n'ait été envoyé à la fermeture de session.

29
Massimo

Réponse trouvée.

Pour BASH, cela dépend de l'option huponexit Shell, qui peut être affichée et/ou définie à l'aide de la commande intégrée shopt.

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 :

Le Shell se ferme par défaut à réception d'un SIGHUP. Avant de quitter, un shell interactif renvoie le SIGHUP à toutes les tâches, en cours d'exécution ou arrêtées. Les travaux arrêtés sont envoyés SIGCONT pour s'assurer qu'ils reçoivent le SIGHUP. Pour empêcher le shell d'envoyer le signal à une tâche particulière, il doit être supprimé de la table des tâches avec le programme intégré désavoué (voir Commandes BUILTIN du shell ci-dessous) ou marqué pour ne pas recevoir SIGHUP en utilisant disown -h.

Si l'option Shell de huponexit a été définie avec shopt, bash envoie un SIGHUP à toutes les tâches lorsqu'un shell de connexion interactive se ferme.

21
Massimo

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.

7
Kim

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:

Nohup - run a command immune to hangups, with output to a non-tty

L'autre option consiste à utiliser la commande screen. L'avantage de l'utilisation de l'écran est que vous pouvez vous reconnecter au processus ultérieurement.

4
Jim

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.

2
Warner

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:

La session SSH tombe - La commande continue-t-elle à s'exécuter?

Modifier 1 à 16h22

Depuis la page de manuel bash:

The Shell exits by default upon receipt of a SIGHUP.   Before  exiting,
an  interactive  Shell  resends  the  SIGHUP  to  all  jobs, running or
topped.

La recherche initiale 1 montre qu'OpenSSH ignore probablement SIGHUP, peut-être plus de signaux.

0
Warner