Dies ist eine Fortsetzung dieser Frage .
Ich habe noch einige Tests durchgeführt. Anscheinend spielt es keine Rolle, ob dies an der physischen Konsole oder über SSH erfolgt, und dies geschieht auch nicht nur mit SCP. Ich habe es auch mit getestet cat /dev/zero > /dev/null
. Das Verhalten ist genau das gleiche:
- Starten Sie einen Prozess im Hintergrund mit
&
(oder fügen Sie ihn in den Hintergrund ein, nachdem Sie mitCTRL-Z
und begonnen habenbg
). Dies geschieht ohne Verwendung vonnohup
. - Abmelden.
- Melden Sie sich erneut an.
- Der Prozess ist immer noch da, läuft glücklich und ist jetzt ein direktes Kind von
init
.
Ich kann bestätigen, dass sowohl SCP als auch CAT sofort beendet werden, wenn ein gesendet wird SIGHUP
. Ich habe das mit getestet kill -HUP
.
Es sieht also so aus, als würde SIGHUP nicht beim Abmelden gesendet , zumindest nicht bei Hintergrundprozessen (aus offensichtlichen Gründen kann es nicht mit einem Vordergrundprozess getestet werden).
Das passierte mir zunächst mit der Servicekonsole von VMware ESX 3.5 (die auf RedHat basiert), aber ich konnte es genau auf CentOS 5.4 replizieren.
Die Frage ist wieder: Sollte ein SIGHUP nicht an Prozesse gesendet werden, auch wenn diese beim Abmelden im Hintergrund ausgeführt werden? Warum passiert das nicht?
Bearbeiten
Ich habe strace
nach Kyles Antwort gefragt.
Wie ich erwartet hatte, erhält der Prozess kein Signal, wenn er sich von der Shell abmeldet, auf der er gestartet wurde. Dies geschieht sowohl bei Verwendung der Serverkonsole als auch über SSH.
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=10676, si_uid=3000090} --- rt_sigreturn() = -1 EINTR (Interrupted system call) rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=13944, si_uid=3000090} --- +++ killed by SIGHUP +++
huponexit
.Antworten:
Antwort gefunden.
Für BASH hängt dies von der
huponexit
Shell-Option ab, die mit dem integriertenshopt
Befehl angezeigt und / oder festgelegt werden kann .Diese Option ist anscheinend standardmäßig deaktiviert, zumindest auf RedHat-basierten Systemen.
Mehr Infos auf der BASH-Manpage :
quelle
Es wird SIGHUP in meinen Tests gesendet:
Shell1:
Shell2:
Wieder Shell1:
Shell2 wieder :
Warum läuft es noch ?:
Erweiterte Programmierung in der Unix-Umgebung von Stevens behandelt dies unter Abschnitt 9.10: Verwaiste Prozessgruppen. Der relevanteste Abschnitt ist:
quelle
$ strace -e signal -p1705 Process 1705 attached --- stopped by SIGTSTP --- --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=791, si_uid=3000090} --- +++ killed by SIGTERM +++
Odd, definitiv nicht in Übereinstimmung mit dem von Stevens zitierten Abschnitt.Ich habe einige Tests mit CentOS 7.1 und bash durchgeführt. Hinweis : Um dieses Mittel
huponexit
istoff
standardmäßig und war für die meisten meiner Tests ab.Dies ist erforderlich,
nohup
wenn Sie einen Job in einem Terminal starten. Wenn Sie dieses Terminal schließen, ohne die Shell sauber zu verlassen , sendet das Terminal das SIGHUP-Signal an die Shell, die es dann an alle untergeordneten Computer sendet. Wenn Sie die Shell sauber beenden, dh der Job muss sich bereits im Hintergrund befinden, damit Sieexit
an der Eingabeaufforderung Control-D eingeben oder drücken können, werden von bash keinerlei Signale an den Hintergrundjob gesendet.Prüfung:
Terminal 1
Terminal 2
(Terminal 1 schließen, siehe Terminal 2):
Beruf
doit.sh
:Starte es im Hintergrund in Terminal 1:
Terminal 1
Strace es in Terminal 2; Schließen Sie Terminal 1 nach einigen Schleifen:
Terminal 2
Ausgabe in Klemme 3:
Terminal 3
Wenn Sie jedoch beenden
bash
, wird es einfach beendet, ohne dass ein Signal an das Kind gesendet wird. Das Terminal wird beendet, weil es kein Kind mehr hat, aber natürlich ist niemand für HUP da die Kinderschale bereits weg ist. DieSIGINT
,SIG_BLOCK
undSIG_SETMASK
Sie sehen unten, sind auf diesleep
in der Shell zurückzuführen.Terminal 1
Terminal 2
Klemme 3, Ausgang
Interessanterweise machte ich mich
huponexit
anshopt -s huponexit; shopt
die Arbeit (letzteres sollte überprüft werden), führte dann den letzten Test durch und schickte erneut bash kein Signal an den Hintergrundprozess . Noch mehr interstingly, wie wir gesehen haben , bash hat das Signal an den Hintergrundprozess senden , nachdem sie es von einem Terminal erhalten , dass in seinem Gesicht geschlossen. Es scheint, als hättehuponexit
es keinen Einfluss auf die eine oder andere Richtung.Ich hoffe, dies beseitigt jedes Rätsel oder jede Verwirrung in Bezug auf zumindest Bashs Huppiness darüber, wann und wie das HUP-Signal gesendet wird. Zumindest waren meine Tests für mich vollständig reproduzierbar. Mich würde interessieren, ob es irgendwelche anderen Einstellungen gibt, die das Verhalten von Bash beeinflussen könnten.
Und wie immer YSMV (Your Shell May Vary).
Anhang 1
Wenn ich eine Shell als
exec /bin/sh
ausführe, dann das Skript als/bin/sh ./doit.sh &
, dann die Shell sauber beenden, werden keine Signale an den Hintergrundjob gesendet und die Ausführung wird bis zum Abschluss fortgesetzt.Anhang 2
Wenn ich eine Shell als
exec /bin/csh
ausführe, dann das Skript als/bin/sh ./doit.sh &
, dann die Shell sauber beenden, werden keine Signale an den Hintergrundjob gesendet und die Ausführung wird bis zum Abschluss fortgesetzt.quelle
Ich benutze csh und Hintergrundprozesse laufen weiter, wenn ich mich abmelde.
quelle