Wie werden diese Verfahrenskonzepte im Zusammenhang zusammen - background
, zombie
, daemon
und without controlling terminal
?
Ich habe das Gefühl, dass sie irgendwie nahe beieinander liegen, besonders durch das Konzept von controlling terminal
, aber es gibt immer noch nicht viele Informationen für mich, um eine Geschichte zu erzählen, zum Beispiel, wenn Sie einem Kind etwas erklären müssen, das einen Artikel über Linux liest, ohne zu viel zu lügen.
UPDATE 1: Zum Beispiel (ich weiß nicht, ob das stimmt)
background
-zombie
- Vordergrundprozess kann nicht werdenzombie
, dazombie
es sich um einen Hintergrundprozess handelt, der ohne übergeordnetes Element belassen wurdedaemon
-without ctty
- alledaemons
laufen ohnectty
, aber nicht alle Prozesse ohnectty
sinddaemons
background
-daemon
- abackground process
kann abgerufen werden, um wieder interaktiv zu laufen,daemon is not
zombie
-without ctty
-zombie
ist gleichgültig, ob es daranctty
befestigt ist oder nichtbackground
-without ctty
-processes
während sie haben in den Hintergrund geschicktctty
und werden Dämonen oder sterben, wenn ihnen dasctty
genommen wird
background-process
daemon
job-control
zombie-process
controlling-terminal
anatoly techtonik
quelle
quelle
fork()
, eine Kopie von sich selbst zu entfernen undexec()
in dieser Kopie zu verwenden um es durch das zu ersetzen, was Sie ausführen möchten, und um eswait()
in der ursprünglichen Programminstanz zu verwenden (nicht in der Kopie, die ausgeführt wurdeexec()
). In der sehr, sehr kurzen Zeitspanne zwischen demwait()
Beenden des Kindes und dem Ernten dieses Beendigungsstatus (Entfernen aus der Prozesstabelle und Zurückgeben an den Anrufer) haben Sie einen Zombie.Antworten:
Kurz gesagt, plus Links.
Zombie
Ein Prozess, der beendet / beendet wurde, dessen übergeordnetes Element die Beendigung jedoch noch nicht bestätigt hat (mithilfe der
wait()
Systemaufrufe). Tote Prozesse werden in der Prozesstabelle gespeichert, damit ihre Eltern darüber informiert werden können, dass ihr Kind über den untergeordneten Prozess verfügt und über ihren Beendigungsstatus. Normalerweise liest ein Programm, das Kinder gabelt, beim Verlassen auch ihren Ausgangsstatus, sodass Sie Zombies nur sehen, wenn die Eltern gestoppt oder fehlerhaft sind.Sehen:
waitpid(2)
Steuerungsterminal, Sitzung, Vordergrund, Hintergrund
Diese beziehen sich auf die Jobsteuerung im Kontext einer Shell, die auf einem Terminal ausgeführt wird. Ein Benutzer meldet sich an, eine Sitzung wird gestartet, an ein Terminal (das steuernde Terminal) gebunden und eine Shell wird gestartet. Die Shell führt dann Prozesse aus und sendet sie im Vordergrund und Hintergrund, wie der Benutzer es wünscht (Verwenden
&
beim Starten des Prozesses, Stoppen mit^Z
, Verwenden vonfg
undbg
). Prozesse im Hintergrund werden gestoppt, wenn vom Terminal aus gelesen oder geschrieben wird. Prozesse im Vordergrund empfangen das Interrupt-Signal, wenn^C
es am Terminal getroffen wird. (Es ist der Terminaltreiber des Kernels, der diese Signale verarbeitet. Die Shell steuert, welcher Prozess (Gruppe) in den Vordergrund oder Hintergrund gesendet wird.Sehen:
Daemon
Ein Prozess, der als Daemon ausgeführt wird, sollte normalerweise nicht an ein bestimmtes Terminal (oder eine Anmeldesitzung oder eine Shell) gebunden sein. Es sollte kein steuerndes Terminal haben, damit es keine Signale empfängt, wenn das Terminal geschlossen wird, und man möchte normalerweise auch nicht, dass es E / A auf einem Terminal ausführt. Das Starten eines Daemons über die Befehlszeile erfordert das Unterbrechen aller Verbindungen zum Terminal, dh das Starten einer neuen Sitzung (im Sinne der Jobsteuerung oben), um das steuernde Terminal zu entfernen, und das Schließen der Dateihandles zum Terminal. Natürlich hätte etwas
init
, das außerhalb einer Anmeldesitzung von systemd oder ähnlichem gestartet wurde , diese Verbindungen zunächst nicht.Da ein Daemon kein steuerndes Terminal hat, unterliegt er keiner Jobsteuerung, und es gilt nicht, im Sinne der Jobsteuerung im "Vordergrund" oder "Hintergrund" zu sein. Außerdem werden Dämonen normalerweise wieder übergeordnet,
init
wodurch sie beim Verlassen gereinigt werden, sodass Sie sie normalerweise nicht als Zombies betrachten.Sehen:
daemon(7)
.quelle
Zombie ist nicht wirklich mit den anderen verwandt; Es ist einfach ein Prozess, der beendet wurde, aber sein übergeordneter Prozess hat seinen Exit-Status noch nicht mit
waitpid()
oder ähnlich gelesen . Sie sollten diese nicht sehen, es sei denn, ein Prozess ist fehlerhaft oder gestoppt.Ein Daemon ist ein Programm, das ohne steuerndes Terminal ausgeführt wird. Wenn Sie das Programm ausführen, wird es
fork()s
normalerweise selbst ausgeführt und das übergeordnete Programm wird beendet, sodass die Shell den Befehl für beendet hält und der untergeordnete Prozess vom Terminal getrennt wird und die Anmeldesitzung verlässt. Da der übergeordnete Prozess beendet wurde, wird die übergeordnete Prozess-ID zu 1, was traditionell dasinit
Programm ist, oder heutzutagesystemd
. Dieser Prozess stellt sicher, dass die Kinder geerntet werden, wenn sie sterben, damit Sie nicht von Zombies überrannt werden.Ein Prozess kann einem steuernden Terminal zugeordnet werden , von dem er normalerweise seine Eingabe erhält und dessen Ausgabe an sendet. Das Terminal kann auch Signale an damit verbundene Prozesse senden und eine Prozessgruppe als Vordergrundgruppe identifizieren . Prozesse, die sich in der Vordergrundgruppe befinden, können Eingaben vom Terminal lesen und erhalten SIGINT- und SIGSUSP-Signale, wenn Sie Strg-C und Strg-Z drücken. Jeder Prozess, der sich nicht in der Vordergrundgruppe befindet und versucht, vom Terminal zu lesen, wird mit SIGTSTP angehalten.
Die Shell erstellt für jeden Pipeline-Befehl, den Sie ausführen sollen, unterschiedliche Prozessgruppen und verschiebt die Vordergrundgruppe , um Jobs zwischen Vordergrund und Hintergrund zu verschieben. Wenn Sie einen Befehl ausführen, erstellt die Shell normalerweise eine neue Prozessgruppe und diese Gruppe zur Vordergrundgruppe . Wenn Sie es mit einem Suffix versehen,
&
verlässt die Shell einfach die Vordergrundgruppe, in der sie sich befand, und die neue Gruppe befindet sich im Hintergrund. Durch Drücken von Strg-Z wird SIGSUSP an die Vordergrundgruppe gesendet, wodurch die meisten Befehle angehalten werden. Anstatt anzuhalten, ändert die Shell die aktive Vordergrundgruppe wieder in sich selbst, sodass Sie zur Eingabe eines neuen Befehls aufgefordert werden können.Der
bg
Befehl sendet SIGCONT an eine Prozessgruppe, damit die Ausführung im Hintergrund fortgesetzt werden kann, nachdem sie mit SIGSUSP angehalten wurde.fg
Ändert die Vordergrundgruppe in eine der vorhandenen Gruppen, die bereits im Hintergrund ausgeführt werden, und bringt sie in den Vordergrund.quelle
Ok, hier ist meine Erklärung mit einer Betonung der Unterschiede zwischen diesen Arten von Prozessen (kurz, aber informativ):
zombie
- Prozess, der gerade beendet wurde (seine Ausführung beendet hat), aber noch einen Eintrag in einer Prozesstabelle hat. Hinweis : Der Zombie- Prozess hat immer noch einen Elternteil und normalerweise besteht der Sinn seiner Existenz darin, diesen Elternprozess über das Ergebnis der Ausführung des Kindes (Exit-Code usw.) zu informieren.disowned process
(ohne Terminal zu steuern) - Prozess, der entweder explizitdisown
vom Benutzer bearbeitet wurde oder von einem übergeordneten Prozessbaum getrennt werden soll. Es würde immer noch ausgeführt, selbst wenn der übergeordnete Prozess die Ausführung beenden würde. Beispielsweise hat ein Benutzerssh
auf einem Remotecomputer einen Webserver gestartet, darauf ausgeführtdisown
und diessh
Sitzung beendet. Der Prozess wird weiterhin ausgeführt, da er nicht mehr Teil eines übergeordneten Prozessbaums ist. Prozess kann auch abgelehnt werden, wenn er ausgeführt wirdnohup
.background process
- läuft im Hintergrund - teilt die Ausgabe nicht auf die tty eines Benutzers auf. Entweder wurde&
am Ende mit ausgeführt oder es wurde von Natur aus ein Hintergrund erstellt. Eine andere Möglichkeit, einen Prozess an einen Hintergrund zu senden, besteht darin, ihn zu starten und zu drückenctrl+z
. Wenn der übergeordnete Prozess jedoch beendet wird, wird auch das im Hintergrund ausgeführte untergeordnete Verfahren beendet ( Hinweis von @psusi - die vorherige Tatsache gilt nur für Prozesse, die vom Benutzer von einem Terminal aus gestartet wurden. Andernfalls wird der untergeordnete Prozess zu einem "Waisen" und erhält einen Init-Prozess (PID 1) als Elternteil).daemon
- sehr ähnlich dem Hintergrundprozess. Läuft auch im Hintergrund, wurde aber höchstwahrscheinlich implizit (beabsichtigt) gegabelt. Normalerweise sitzt es ruhig im Hintergrund und wartet darauf, dass einige überhaupt auftreten, und erst dann funktioniert es tatsächlich (eingehende Verbindung usw.). Eigentlich Daemon kann beide wird verleugnet (wahrscheinlicher) und Hintergrund - Prozess abhängig von seinem Entwurf.Ich hoffe, diese Erklärung würde helfen, diese Art von Prozessen zu unterscheiden.
quelle
tree
. Ja, sicher, Eltern sind nicht verpflichtet, nach Beendigung des Kindes zu kündigen (dies kann jedoch geschehen, wenn sie darauf gewartet haben, dass ein Kind die Verarbeitung von Dingen beendet). Aber wenn Eltern kündigen würden, würde Kind definitiv kündigen. Sie könnentop
von Ihrem Terminal aus laufen und dann drückenshift-v
, um Prozessbäume in freier Wildbahn anzuzeigen.