Contexte, zombie, démon et sans ctty - ces concepts sont-ils liés?

8

Comment ces concepts de processus sont liés ensemble - background, zombie, daemonet without controlling terminal?

Je pense qu'ils sont en quelque sorte proches, en particulier à travers le concept de controlling terminal, mais il n'y a toujours pas beaucoup d'informations pour raconter une histoire, comme si vous avez besoin d'expliquer quelque chose à un enfant qui lit un article sur Linux sans mentir trop.

MISE À JOUR # 1: Par exemple (je ne sais pas si c'est vrai)

  • background- zombie- le processus de premier plan ne peut pas devenir zombie, car zombiec'est un processus d'arrière-plan qui a été laissé sans parent
  • daemon- without ctty- tous daemonss'exécutent sans ctty, mais tous les processus sans cttysontdaemons
  • background- daemon- a background processpeut être récupéré pour s'exécuter de nouveau de manière interactive,daemon is not
  • zombie- without ctty- zombieest indifférent s'il y soit cttyattaché ou non
  • background- without ctty- processesenvoyés à l'arrière-plan pendant qu'ils sont ctty, et deviennent des démons ou meurent s'ils leur cttysont enlevés
anatoly techtonik
la source
Un processus de premier plan peut certainement être un zombie, bien que généralement pas pendant une période de temps appréciable - la manière habituelle pour un shell (ou un autre programme) d'exécuter un sous-processus au premier plan est de fork()désactiver une copie de vous-même, utilisez-la exec()dans cette copie pour le remplacer par ce que vous voulez exécuter, et utiliser wait()dans l'instance d'origine du programme (pas la copie qui s'est exécutée exec()). Dans la très, très courte période de temps entre le moment où l'enfant quitte et le moment où les wait()moissonneurs sortent de l'état (en le supprimant de la table de processus et en le renvoyant à l'appelant), vous avez un zombie.
Charles Duffy
@CharlesDuffy est-il possible d'envoyer le parent à l'arrière-plan tout en laissant l'enfant courir au premier plan?
anatoly techtonik
Dans un contrôle de travail typique , le shell ne sait même pas que le petit-enfant est séparé de son enfant direct; il attend juste la sortie de son enfant, et si l'enfant attend la sortie d'un petit-enfant, eh bien, c'est l'affaire de l'enfant. Ce qui veut dire - du point de vue de la coquille qui a engendré le parent, il ne s'agit que d'une seule unité.
Charles Duffy

Réponses:

10

En bref, plus des liens.

zombi

un processus qui s'est terminé / s'est terminé, mais dont le parent n'a pas encore reconnu la fin (à l'aide des wait()appels système). Les processus morts sont conservés dans la table de processus afin que leur parent puisse être informé de la sortie de leur enfant du processus enfant et de leur statut de sortie. Habituellement, un programme bifurquant les enfants lira également leur statut de sortie à leur sortie, vous ne verrez donc des zombies que si le parent est arrêté ou buggé.

Voir:

terminal de contrôle, session, premier plan, arrière-plan

Celles-ci sont liées au contrôle des travaux dans le contexte d'un shell exécuté sur un terminal. Un utilisateur se connecte, une session est lancée, liée à un terminal (le terminal de contrôle) et un shell est démarré. Le shell exécute ensuite les processus et les envoie au premier plan et en arrière-plan comme l'utilisateur le souhaite (en utilisant &au démarrage du processus, en l'arrêtant avec ^Z, en utilisant fget bg). Les processus en arrière-plan sont arrêtés en cas de lecture ou d'écriture à partir du terminal; les processus au premier plan reçoivent le signal d'interruption s'il ^Cest touché sur le terminal. (C'est le pilote de terminal du noyau qui gère ces signaux, le shell contrôle quel processus (groupe) est envoyé au premier plan ou à l'arrière-plan.

Voir:

démon

Un processus exécuté en tant que démon est généralement quelque chose qui ne doit pas être lié à un terminal particulier (ou à une session de connexion ou à un shell). Il ne devrait pas avoir de terminal de contrôle, afin qu'il ne reçoive pas de signaux si le terminal se ferme, et on ne veut généralement pas qu'il fasse des E / S sur un terminal non plus. Le démarrage d'un démon à partir de la ligne de commande nécessite de rompre tous les liens avec le terminal, c'est-à-dire de démarrer une nouvelle session (dans le sens du contrôle des tâches ci-dessus) pour se débarrasser du terminal de contrôle et de fermer les poignées de fichier du terminal. Bien sûr, quelque chose à partir de init, systemd ou similaire en dehors d'une session de connexion n'aurait pas ces liens pour commencer.

Étant donné qu'un démon n'a pas de terminal de contrôle, il n'est pas soumis au contrôle des travaux et le fait d'être au premier plan ou en arrière-plan au sens du contrôle des travaux ne s'applique pas. De plus, les démons se reparent généralement à ceux initqui les nettoient à leur sortie, vous ne les voyez donc généralement pas comme des zombies.

Voir:

ilkkachu
la source
4

Zombie n'est pas vraiment lié aux autres; il s'agit simplement d'un processus qui s'est terminé, mais son processus parent n'a pas encore lu son état de sortie avec waitpid()ou similaire. Vous ne devriez pas les voir sauf si un processus est bogué ou arrêté.

Un démon est un programme qui s'exécute sans terminal de contrôle. En règle générale, lorsque vous exécutez le programme, lui- fork()smême et le parent se ferme de sorte que le shell pense que la commande est terminée et que le processus enfant se détache du terminal et échappe à la session de connexion. Depuis la fin de son processus parent, son ID de processus parent devient 1, qui est traditionnellement le initprogramme, ou de nos jours systemd,. Ce processus garantit de récolter ses enfants à leur mort afin de ne pas vous retrouver envahi par des zombies.

Un processus peut être associé à un terminal de contrôle , où il obtient normalement son entrée et envoie sa sortie. Le terminal peut également envoyer des signaux aux processus qui lui sont attachés et identifie un groupe de processus comme groupe de premier plan . Les processus qui sont dans le groupe de premier plan sont autorisés à lire l'entrée du terminal et sont envoyés des signaux SIGINT et SIGSUSP lorsque vous appuyez sur Ctrl-C et Ctrl-Z. Tout processus ne faisant pas partie du groupe de premier plan qui tente de lire à partir du terminal est suspendu avec SIGTSTP.

Le shell crée différents groupes de processus pour chacune des commandes de pipeline que vous lui demandez d'exécuter, et décale celui qui est le groupe de premier plan pour déplacer les travaux entre le premier plan et l'arrière-plan. Lorsque vous exécutez une commande, le shell crée normalement un nouveau groupe de processus et fait de ce groupe le groupe de premier plan . Si vous le suffixez avec un, &le shell laisse simplement le groupe de premier plan où il était et le nouveau groupe est donc en arrière-plan. En appuyant sur Ctrl-Z, SIGSUSP est envoyé au groupe de premier plan, ce qui entraîne la suspension de la plupart des commandes, mais au lieu de le suspendre, le shell modifie le groupe de premier plan actif pour qu'il puisse vous demander une nouvelle commande.

La bgcommande envoie SIGCONT à un groupe de processus afin qu'il puisse reprendre son exécution en arrière-plan après avoir été suspendu avec SIGSUSP. fgremplace le groupe de premier plan par l'un des groupes existants qui s'exécutent déjà en arrière-plan, le plaçant au premier plan.

psusi
la source
4

Ok, voici mon explication avec un accent sur les différences entre ces types de processus (court mais informatif):

  • zombie- processus qui vient de se terminer (terminé son exécution) mais qui a toujours une entrée dans une table de processus. Remarque : le processus zombie a toujours un parent et généralement le but de son existence est de faire savoir au processus parent le résultat de l'exécution de l'enfant (code de sortie, etc.).
  • disowned process(sans terminal de contrôle) - processus qui a été explicitement disownédité par l'utilisateur ou conçu pour être détaché d'une arborescence de processus parent. Il continuerait de s'exécuter même si le processus parent terminait son exécution. Par exemple, l'utilisateur sshs'est dirigé vers une machine distante, a démarré quelque chose comme un serveur Web, puis s'est exécuté disowndessus et a quitté la sshsession. Le processus serait toujours en cours d'exécution car il ne fait plus partie d'une arborescence de processus parent. Le processus peut également être désavoué en l'exécutant nohup.
  • background process- s'exécute en arrière-plan - ne divise pas la sortie en tty d'un utilisateur. Soit a été exécuté avec &à la fin, soit se fourra à un arrière-plan par conception. Une autre option pour envoyer un processus en arrière-plan consiste à le démarrer et à appuyer sur ctrl+z. Pourtant, lorsque le processus parent se terminera, l'enfant s'exécutant en arrière-plan se terminera également ( note de @psusi - le fait antérieur n'est vrai qu'avec les processus démarrés à partir d'un terminal par l'utilisateur; sinon le processus enfant devient un `` orphant '' et obtient un processus init (pid 1) en tant que parent).
    • daemon- très similaire au processus d'arrière-plan. Fonctionne également en arrière-plan, mais a probablement été implicitement bifurqué (par conception). Habituellement, il se trouve tranquillement dans un arrière-plan en attendant que certains se produisent même et ne fait alors qu'un travail réel (connexion entrante etc.) En fait, le démon peut être à la fois désavoué (plus probablement) et processus d' arrière - plan selon sa conception.

J'espère que cette explication aiderait à distinguer ces types de processus.

ddnomad
la source
Agréable. La table de processus appartient au parent? Alors les zombies meurent sans leur maître?
anatoly techtonik
La table n'est pas un bon mot. C'est plutôt un processus tree. Oui, bien sûr, le parent n'est pas obligé de se terminer après la fin de son enfant (mais il peut le faire s'il attendait qu'un enfant termine le traitement d'une sorte de choses). Mais si le parent mettait fin - l'enfant se terminerait définitivement. Vous pouvez exécuter à toppartir de votre terminal, puis appuyer sur shift-vpour voir les arborescences de processus dans un état sauvage.
ddnomad
1
Un parent qui met fin ne tue pas ses enfants. Les enfants orphelins ont changé leur ID de processus parent en init (1).
psusi
@psusi vous avez raison, j'ai oublié que c'est seulement avec les processus démarrés dans le terminal. Je vais corriger ma réponse.
ddnomad
Je supprimerais simplement la phrase "il disparaîtrait bientôt d'une table". Il suggère qu'il disparaît en quelque sorte automatiquement après un certain temps, mais ce n'est pas le cas; la «disparition» est un événement très concret.
AnoE