Comment ces concepts de processus sont liés ensemble - background
, zombie
, daemon
et 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 devenirzombie
, carzombie
c'est un processus d'arrière-plan qui a été laissé sans parentdaemon
-without ctty
- tousdaemons
s'exécutent sansctty
, mais tous les processus sansctty
sontdaemons
background
-daemon
- abackground process
peut être récupéré pour s'exécuter de nouveau de manière interactive,daemon is not
zombie
-without ctty
-zombie
est indifférent s'il y soitctty
attaché ou nonbackground
-without ctty
-processes
envoyés à l'arrière-plan pendant qu'ils sontctty
, et deviennent des démons ou meurent s'ils leurctty
sont enlevés
background-process
daemon
job-control
zombie-process
controlling-terminal
anatoly techtonik
la source
la source
fork()
désactiver une copie de vous-même, utilisez-laexec()
dans cette copie pour le remplacer par ce que vous voulez exécuter, et utiliserwait()
dans l'instance d'origine du programme (pas la copie qui s'est exécutéeexec()
). Dans la très, très courte période de temps entre le moment où l'enfant quitte et le moment où leswait()
moissonneurs sortent de l'état (en le supprimant de la table de processus et en le renvoyant à l'appelant), vous avez un zombie.Réponses:
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:
waitpid(2)
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 utilisantfg
etbg
). 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^C
est 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
init
qui les nettoient à leur sortie, vous ne les voyez donc généralement pas comme des zombies.Voir:
daemon(7)
.la source
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()s
mê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 leinit
programme, ou de nos jourssystemd
,. 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
bg
commande 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.fg
remplace 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.la source
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é explicitementdisown
é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'utilisateurssh
s'est dirigé vers une machine distante, a démarré quelque chose comme un serveur Web, puis s'est exécutédisown
dessus et a quitté lassh
session. 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écutantnohup
.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 surctrl+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.
la source
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 àtop
partir de votre terminal, puis appuyer surshift-v
pour voir les arborescences de processus dans un état sauvage.