web-dev-qa-db-fra.com

Pourquoi certains programmes exécutés à partir de Terminal avec '&' sont-ils fermés alors que Terminal ne le fait pas?

Je me demandais, par exemple, lorsque je lance qtoxavec:

qtox &

Et puis fermez Terminal, qtoxse ferme avec elle. Cependant, lorsque vous exécutez etherapeen utilisant:

Sudo etherape &

La fermeture du terminal ne ferme pas et ne pose aucun problème à Etherape. Et parmi les différentes applications, il existe un comportement différent, certains se ferment quand un terminal le fait, d'autres pas, pourquoi? Pourquoi certains ferment-ils alors que d'autres ne le font pas? J'utilise Ubuntu GNOME 15.10 avec GNOME 3.18.

27
user364819

Lorsque vous fermez un terminal, celui-ci envoie un signal SIGHUP au shell; Le shell, à son tour, envoie un signal SIGHUP à tous ses groupes de processus enfants, qui incluent des groupes de processus en arrière-plan;

La manière dont chaque processus réagira au signal dépend entièrement du processus: si le processus ne définit pas de gestionnaire pour le signal et informe le noyau (via un appel système tel que signal() ou sigaction() ) qu’il souhaite gérer, le noyau exécute le gestionnaire par défaut du signal, qui dans le cas d’un signal SIGHUP consiste à terminer le processus.

Toutefois, lorsque vous exécutez une commande avec Sudoname__, l'UID du processus Sudoet de son processus enfant est défini sur 0 (root); en général, à moins que l'UID du processus qui envoie le signal soit 0 (racine) ou identique au processus cible, le noyau supprime le signal (c'est-à-dire qu'un processus ne peut pas envoyer de signaux à un processus appartenant à un autre utilisateur, sauf si le le processus d’envoi du signal appartient à root); C'est pourquoi un processus exécuté par l'utilisateur, tel que l'instance Bash exécutée par le terminal, ne peut pas SIGHUP un processus Sudoet, en fin de compte, la fermeture d'un terminal n'affecte pas un processus démarré avec Sudoname__.

36
kos