Hintergrund, Zombie, Daemon und ohne Ctty - sind diese Konzepte miteinander verbunden?

8

Wie werden diese Verfahrenskonzepte im Zusammenhang zusammen - background, zombie, daemonund 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 werden zombie, da zombiees sich um einen Hintergrundprozess handelt, der ohne übergeordnetes Element belassen wurde
  • daemon- without ctty- alle daemonslaufen ohne ctty, aber nicht alle Prozesse ohne cttysinddaemons
  • background- daemon- a background processkann abgerufen werden, um wieder interaktiv zu laufen,daemon is not
  • zombie- without ctty- zombieist gleichgültig, ob es daran cttybefestigt ist oder nicht
  • background- without ctty- processeswährend sie haben in den Hintergrund geschickt cttyund werden Dämonen oder sterben, wenn ihnen das cttygenommen wird
anatoly techtonik
quelle
Ein Vordergrundprozess kann sicherlich ein Zombie sein, obwohl dies normalerweise nicht für einen nennenswerten Zeitraum der Fall ist. Die übliche Methode für eine Shell (oder ein anderes Programm), einen Unterprozess im Vordergrund auszuführen, besteht darin fork(), eine Kopie von sich selbst zu entfernen und exec()in dieser Kopie zu verwenden um es durch das zu ersetzen, was Sie ausführen möchten, und um es wait()in der ursprünglichen Programminstanz zu verwenden (nicht in der Kopie, die ausgeführt wurde exec()). In der sehr, sehr kurzen Zeitspanne zwischen dem wait()Beenden des Kindes und dem Ernten dieses Beendigungsstatus (Entfernen aus der Prozesstabelle und Zurückgeben an den Anrufer) haben Sie einen Zombie.
Charles Duffy
@CharlesDuffy Ist es möglich, Eltern in den Hintergrund zu schicken, während das Kind im Vordergrund läuft?
Anatoly Techtonik
Bei der typischen Jobkontrolle weiß die Shell nicht einmal, dass das Enkelkind überhaupt von seinem direkten Kind getrennt ist. Es wartet nur darauf, dass sein Kind austritt, und wenn das Kind darauf wartet, dass ein Enkelkind austritt, ist das die Sache des Kindes. Das heißt - aus der Perspektive der Hülle, aus der der Elternteil hervorgegangen ist, handelt es sich nur um eine Einheit.
Charles Duffy

Antworten:

10

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:

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 von fgund bg). Prozesse im Hintergrund werden gestoppt, wenn vom Terminal aus gelesen oder geschrieben wird. Prozesse im Vordergrund empfangen das Interrupt-Signal, wenn ^Ces 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, initwodurch sie beim Verlassen gereinigt werden, sodass Sie sie normalerweise nicht als Zombies betrachten.

Sehen:

ilkkachu
quelle
4

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()snormalerweise 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 das initProgramm ist, oder heutzutage systemd. 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 bgBefehl 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.

psusi
quelle
4

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 explizit disownvom 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 Benutzer sshauf einem Remotecomputer einen Webserver gestartet, darauf ausgeführt disownund die sshSitzung 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 wird nohup.
  • 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ücken ctrl+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.

ddnomad
quelle
Nett. Prozesstabelle gehört zum übergeordneten? Also sterben Zombies ohne ihren Meister?
Anatoly Techtonik
Tabelle ist kein richtiges Wort. Es ist eher ein Prozess 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önnen topvon Ihrem Terminal aus laufen und dann drücken shift-v, um Prozessbäume in freier Wildbahn anzuzeigen.
ddnomad
1
Ein Elternteil, das kündigt, tötet seine Kinder nicht. Bei den verwaisten Kindern wurde die übergeordnete Prozess-ID in init (1) geändert.
Psusi
@psusi du hast recht, ich habe vergessen, dass es nur bei Prozessen so ist, die im Terminal gestartet wurden. Ich werde meine Antwort korrigieren.
ddnomad
Ich würde einfach den Satz "es würde bald von einem Tisch verschwinden" entfernen. Es deutet darauf hin, dass es nach einiger Zeit irgendwie automatisch verschwindet, aber das ist nicht der Fall; Das "Verschwinden" ist ein sehr konkretes Ereignis.
AnoE