Der Hintergrundprozess eines Skripts ist nach dem Schließen des Terminals noch aktiv

Der Hintergrundprozess eines Skripts ist nach dem Schließen des Terminals noch aktiv

Dies ist eher eine Frage zum Prozessmanagement/Signalhandling als eine Bash-Frage. Es wird lediglich Bash verwendet, um das Problem zu erklären.

Ich führe ein Bash-Skript aus, in dem ich einen Hintergrundprozess ausführe. Dies ist das Skript:

#!/bin/bash

# ...

# The background process
{ 
  while :; do
    sleep 1 && echo foo >> /path/to/some/file.txt
  done
} &

# ...

exit 0

Ich lasse das Skript selbst NICHT im Hintergrund laufen. Einfach ./script.

Die Shell-Option „huponexit“ wird mit aktiviert shopt -s huponexit. Wenn das Terminal geschlossen wird, erwarte ich daher, dass es ein HUP-Signal an Bash sendet, das es weiterleitet, bis es den Hintergrundprozess erreicht. Wenn der Hintergrundprozess trapdas Signal nicht ignoriert, wird er ebenfalls beendet – aber das passiert nicht. Der Hintergrundprozess verhält sich, als wäre er disownbeendet worden.

Dies ist ein Schema, das ich gezeichnet habe, um das Problem zu veranschaulichen. Das Schema und die obige Beschreibung können falsch sein, da ich mir sicher bin, dass ich das Thema nicht gut genug verstehe. Bitte klären Sie mich auf, wenn das wirklich der Fall ist.

Bildbeschreibung hier eingeben

Ich möchte wissen, warum der Hintergrundprozess nach dem Schließen des Terminals nicht beendet wird, als ob er von einer interaktiven Shell wie dieser aufgerufen worden wäre:

rany@~/Desktop$ while :; do sleep 1 && echo foo >> /path/to/some/file.txt; done &

Ich bin nicht sicher, aber ich vermute, dass die Antwort auf meine Frage in der Tatsache liegt, dass Bash zum Ausführen des Skripts eine nicht interaktive Shell verwendet, die möglicherweise andere Regeln für die Jobsteuerung und Signalverarbeitung hat.

Antwort1

Was also sagt uns die Manpage darüber huponexit?

Wenn die Shell-Option huponexit mit shopt gesetzt wurde, sendet bash ein SIGHUP an alle Jobs, wenn eininteraktive AnmeldungShell wird beendet.

BEARBEITEN: Betonen Sie, dass es sich um eine LOGIN-Shell handelt.

EDIT 2: Interaktiv verdient die gleiche Betonung

verwandte Informationen