GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Nachkommen verarbeiten?

Ich versuche, einen Prozesscontainer zu erstellen. Der Container löst andere Programme aus. Zum Beispiel – ein Bash-Skript, das laufende Hintergrundaufgaben mit der Verwendung von „&“ startet.

Das wichtige Feature, das ich suche, ist folgendes:Wenn ich den Container töte, sollte alles, was darunter gespawnt wurde, getötet werden. Nicht nur direkte Kinder, sondern auch deren Nachkommen.

Als ich mit diesem Projekt begann, glaubte ich fälschlicherweise, dass beim Beenden eines Prozesses automatisch auch seine untergeordneten Prozesse beendet würden. Ich habe Leute um Rat gefragt, die die gleiche falsche Idee hatten. Es ist zwar möglich, ein Signal zu empfangen und die Tötung an Kinder weiterzugeben, aber das ist nicht das, wonach ich hier suche.

Ich glaube, was ich erreichen möchte, denn wenn Sie ein xterm schließen, wird alles, was darin lief, beendet, es sei denn, es wurde nicht aktualisiert. Dazu gehören verwaiste Prozesse. Das möchte ich nachbauen.

Ich habe eine Ahnung, dass das, wonach ich suche, Unix-Sitzungen beinhaltet.

Wenn es einen zuverlässigen Weg gäbe, alle Nachkommen eines Prozesses zu identifizieren, wäre es nützlich, ihnen auch beliebige Signale senden zu können. z.B. SIGUSR1.

Akzeptierte Antwort:

Wenn Sie ein Signal an einen Prozess senden, wird dieser Prozess beendet. Ich frage mich, wie das Gerücht entstanden ist, dass das Beenden eines Prozesses auch andere Prozesse beendet, es scheint besonders kontraintuitiv zu sein.

Es gibt jedoch Möglichkeiten, mehr als einen Prozess zu beenden. Aber Sie werden kein Signal an einen Prozess senden. Sie können eine ganze Prozessgruppe beenden, indem Sie ein Signal an -1234 senden, wobei 1234 die PGID (Prozessgruppen-ID) ist, die die PID des Prozessgruppenleiters ist. Wenn Sie eine Pipeline ausführen, beginnt die gesamte Pipeline als Prozessgruppe (die Anwendungen können dies ändern, indem sie setpgid aufrufen oder setpgrp ).

Wenn Sie Prozesse im Hintergrund starten (foo & ), befinden sie sich in einer eigenen Prozessgruppe. Prozessgruppen werden verwendet, um den Zugriff auf das Terminal zu verwalten; normalerweise hat nur die Prozessgruppe im Vordergrund Zugriff auf das Terminal. Die Hintergrundjobs bleiben in derselben Sitzung, aber es gibt keine Möglichkeit, eine ganze Sitzung zu beenden oder sogar die Prozessgruppen oder Prozesse in einer Sitzung aufzuzählen, das hilft also nicht viel.

Wenn Sie ein Terminal schließen, sendet der Kernel das Signal SIGHUP an alle Prozesse, die es als steuerndes Terminal haben. Diese Prozesse bilden eine Sitzung, aber nicht alle Sitzungen haben ein steuerndes Terminal. Für Ihr Projekt besteht daher eine Möglichkeit darin, alle Prozesse in einem eigenen Terminal zu starten, das per Skript, Bildschirm usw. erstellt wurde. Beenden Sie den Terminal-Emulator-Prozess, um die enthaltenen Prozesse zu beenden (vorausgesetzt, sie haben sich nicht mit setsid ).

Verwandte:Wie kann man den Prozess beenden, der die apt-Sperre hält?

Sie können für mehr Isolation sorgen, indem Sie die Prozesse als ihr eigener Benutzer ausführen, der sonst nichts tut. Dann ist es einfach, alle Prozesse zu beenden:Führen Sie kill aus (der Systemaufruf oder das Dienstprogramm) als dieser Benutzer und verwenden Sie -1 als PID-Argument zum Beenden, was "alle Prozesse dieses Benutzers" bedeutet.

Sie können für noch mehr Isolation sorgen, aber mit erheblich mehr Setup, indem Sie die enthaltenen Prozesse in einem tatsächlichen Container ausführen.


Linux
  1. kill-Befehlsbeispiele in Linux

  2. So beenden Sie den Zombie-Prozess

  3. Wie man einen Prozess unter Linux anhält/fortsetzt

  4. Killing-Prozesse in Raspbian

  5. Wann sollte ich einen Prozess nicht beenden -9?

Kill-Befehl unter Linux

So beenden Sie Zombie-Prozesse in Linux

5 schnelle Möglichkeiten, einen Prozess in Linux zu beenden

Wie man einen Prozess unter Linux beendet

So töten Sie Zombie-Prozesse in Ubuntu

4 Möglichkeiten, einen Prozess zu beenden – kill, killall, pkill, xkill