Tl; dr:
Warum kann der sleep
Prozess überleben, wenn ich mich abmelde und das Terminal geschlossen ist? In meinen Augen wird alles außer Dämonen und nohup
Programmen beim Abmelden getötet. Wenn sleep
ich auf diese Weise überleben kann, bedeutet das, dass ich diese Methode anstelle des nohup
Befehls verwenden kann?
Sofern für die von bash
erzeugte Instanz ssh
die huponexit
Option festgelegt ist, wird kein Prozess beim Beenden / Abmelden auf irgendeine Weise beendet. Wenn die huponexit
Option festgelegt ist, ist die Verwendung kill -9
in der Shell keine gute Alternative zur Verwendung nohup
in den untergeordneten Prozessen der Shell. nohup
Auf den untergeordneten Prozessen der Shell werden sie weiterhin vor SIGHUPs geschützt, die nicht von der Shell stammen, und selbst wenn dies nicht wichtig nohup
ist , ist dies immer noch zu bevorzugen, da die Shell ordnungsgemäß beendet werden kann.
In bash
gibt es eine Option namens huponexit
, die, wenn gesetzt, bash
SIGHUP seine Kinder beim Beenden / Abmelden macht;
In interaktiven Instanzen ohne Anmeldung bash
, z. B. in einer von bash
erzeugten Instanz gnome-terminal
, wird diese Option ignoriert. ob huponexit
gesetzt oder nicht gesetzt, werden bash
die Kinder bash
beim Verlassen niemals von SIGHUPped ;
In interaktiven Anmeldeinstanzen bash
, z. B. in einer von bash
erzeugten Instanz ssh
, wird diese Option nicht ignoriert (sie ist jedoch standardmäßig deaktiviert). Wenn huponexit
festgelegt, bash
werden die untergeordneten Elemente bash
beim Beenden / Abmelden von SIGHUPped . Wenn dies nicht festgelegt huponexit
ist, werden bash
die Kinder bash
beim Beenden / Abmelden nicht von SIGHUPped .
Im Allgemeinen wird das Beenden / Abmelden von einer interaktiven Anmeldeinstanz bash
, sofern die huponexit
Option nicht aktiviert ist, die Shell nicht zu ihren untergeordneten SIGHUP machen, und das Beenden / Abmelden von einer interaktiven bash
Instanz ohne Anmeldung macht die Shell nicht zu ihren untergeordneten SIGHUP ungeachtet;
Dies ist jedoch irrelevant in diesem Fall: mit kill -9
sleep
unabhängig überleben, weil seinen Eltern - Prozess zu töten ( bash
) keine Chance läßt letztere tun alles , um die alten (also beispielsweise , wenn die aktuelle bash
Instanz ist eine Login - bash
Instanz und die huponexit
Option wurde gesetzt, um es zu registrieren).
Im Gegensatz zu anderen Signalen (wie einem SIGHUP-Signal, an das gesendet wird bash
) wird ein SIGKILL-Signal niemals an die untergeordneten Prozesse eines Prozesses weitergegeben und daher sleep
nicht einmal getötet.
nohup
startet einen Prozess, der gegen SIGHUP-Signale immun ist, was etwas anderes ist; Dadurch wird verhindert, dass der Prozess beim Empfang eines SIGHUP-Signals hängen bleibt, das in diesem Fall von der interaktiven Anmeldeinstanz empfangen werden kann, bash
falls die huponexit
Option festgelegt und die Shell beendet wurde. Wenn Sie also technisch gesehen nohup
einen Prozess in einer interaktiven Anmeldeinstanz bash
mit der huponexit
Option "Nicht gesetzt" starten, wird verhindert, dass der Prozess beim Empfang eines SIGHUP-Signals hängen bleibt. Wenn Sie die Shell jedoch verlassen / abmelden, wird sie unabhängig davon nicht SIGHUP.
Im Allgemeinen gibt es jedoch nohup
keinen Grund, die kill -9
On-Parent-Methode der nohup
On-Child-Methode vorzuziehen , wenn dies erforderlich ist, um zu verhindern, dass SIGHUP-Signale von der übergeordneten Shell kommen . stattdessen sollte es das Gegenteil sein.
Das Töten des Elternteils mit der kill -9
Methode lässt dem Elternteil keine Möglichkeit nohup
, ordnungsgemäß zu beenden , während das Starten des Kindes mit der Methode es dem Elternteil ermöglicht, durch andere Signale wie SIGHUP beendet zu werden (um ein Beispiel zu erstellen, das im Kontext sinnvoll ist eines Kindes begann zu verwenden nohup
), die es ermöglichen, anmutig zu beenden.
&
Der Prozess wird in den Hintergrund verschoben (wie bei einem Daemon) und läuft weiter, obwohl Sie abgemeldet sind.