Tl; dr:
Warum kann der sleepProzess überleben, wenn ich mich abmelde und das Terminal geschlossen ist? In meinen Augen wird alles außer Dämonen und nohupProgrammen beim Abmelden getötet. Wenn sleepich auf diese Weise überleben kann, bedeutet das, dass ich diese Methode anstelle des nohupBefehls verwenden kann?
Sofern für die von basherzeugte Instanz sshdie huponexitOption festgelegt ist, wird kein Prozess beim Beenden / Abmelden auf irgendeine Weise beendet. Wenn die huponexitOption festgelegt ist, ist die Verwendung kill -9in der Shell keine gute Alternative zur Verwendung nohupin den untergeordneten Prozessen der Shell. nohupAuf den untergeordneten Prozessen der Shell werden sie weiterhin vor SIGHUPs geschützt, die nicht von der Shell stammen, und selbst wenn dies nicht wichtig nohupist , ist dies immer noch zu bevorzugen, da die Shell ordnungsgemäß beendet werden kann.
In bashgibt es eine Option namens huponexit, die, wenn gesetzt, bashSIGHUP seine Kinder beim Beenden / Abmelden macht;
In interaktiven Instanzen ohne Anmeldung bash , z. B. in einer von basherzeugten Instanz gnome-terminal, wird diese Option ignoriert. ob huponexitgesetzt oder nicht gesetzt, werden bashdie Kinder bashbeim Verlassen niemals von SIGHUPped ;
In interaktiven Anmeldeinstanzen bash , z. B. in einer von basherzeugten Instanz ssh, wird diese Option nicht ignoriert (sie ist jedoch standardmäßig deaktiviert). Wenn huponexitfestgelegt, bashwerden die untergeordneten Elemente bashbeim Beenden / Abmelden von SIGHUPped . Wenn dies nicht festgelegt huponexitist, werden bashdie Kinder bashbeim Beenden / Abmelden nicht von SIGHUPped .
Im Allgemeinen wird das Beenden / Abmelden von einer interaktiven Anmeldeinstanz bash, sofern die huponexitOption nicht aktiviert ist, die Shell nicht zu ihren untergeordneten SIGHUP machen, und das Beenden / Abmelden von einer interaktiven bashInstanz ohne Anmeldung macht die Shell nicht zu ihren untergeordneten SIGHUP ungeachtet;
Dies ist jedoch irrelevant in diesem Fall: mit kill -9 sleepunabhä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 bashInstanz ist eine Login - bashInstanz und die huponexitOption 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 sleepnicht einmal getötet.
nohupstartet 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, bashfalls die huponexitOption festgelegt und die Shell beendet wurde. Wenn Sie also technisch gesehen nohupeinen Prozess in einer interaktiven Anmeldeinstanz bashmit der huponexitOption "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 nohupkeinen Grund, die kill -9On-Parent-Methode der nohupOn-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 -9Methode 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.