Zitieren der Bash-Dokumentation (von man bash
):
JOB CONTROL
Job control refers to the ability to selectively stop
(suspend) the execution of processes and continue (resume)
their execution at a later point. A user typically employs
this facility via an interactive interface supplied jointly
by the operating system kernel's terminal driver and bash.
Also, ganz einfach gesagt, mit set -m
(der Standard für interaktive Shells) können Sie integrierte Funktionen wie fg
und verwenden bg
, die unter set +m
(der Standard für nicht interaktive Shells) deaktiviert sind.
Mir ist nicht klar, wie die Verbindung zwischen Jobsteuerung und dem Beenden von Hintergrundprozessen beim Beenden aussieht, aber ich kann bestätigen, dass es einen gibt: Beim Ausführen set -m; (sleep 10 ; touch control-on) &
wird die Datei erstellt, wenn die Shell direkt nach der Eingabe dieses Befehls beendet set +m; (sleep 10 ; touch control-off) &
wird, nicht jedoch.
Ich denke, die Antwort liegt im Rest der Dokumentation für set -m
:
-m Monitor mode. [...] Background pro‐
cesses run in a separate process group and a line con‐
taining their exit status is printed upon their comple‐
tion.
Dies bedeutet, dass Hintergrundjobs, unter set +m
denen gestartet wurde, keine tatsächlichen "Hintergrundprozesse" sind ("Hintergrundprozesse sind Prozesse, deren Prozessgruppen-ID von der des Terminals abweicht"): Sie haben dieselbe Prozessgruppen-ID wie die Shell, von der sie gestartet wurden, und keine eigene Prozessgruppe wie richtige Hintergrundprozesse. Dies erklärt das Verhalten, das beobachtet wird, wenn die Shell vor einigen ihrer Hintergrundjobs beendet wird: Wenn ich richtig verstehe, wird beim Beenden ein Signal an die Prozesse in derselben Prozessgruppe wie die Shell gesendet (wodurch Hintergrundjobs beendet werden, die unter gestartet wurden set +m
), jedoch nicht zu denen anderer Prozessgruppen (und damit von wahren Hintergrundprozessen, unter denen begonnen wurde set -m
).
In Ihrem Fall startup.sh
startet das Skript also vermutlich einen Hintergrundjob. Wenn dieses Skript nicht interaktiv ausgeführt wird, z. B. über SSH, wie in der Frage, mit der Sie verknüpft sind, ist die Jobsteuerung deaktiviert. Der "Hintergrund" -Job teilt sich die Prozessgruppe der Remote-Shell und wird daher abgebrochen, sobald diese Shell beendet wird. Umgekehrt erhält der Hintergrundjob durch Aktivieren der Jobsteuerung in dieser Shell eine eigene Prozessgruppe und wird nicht beendet, wenn die übergeordnete Shell beendet wird.
tomcat/bin/startup.sh
mitfg
/ zusammenbg
?Ich habe dies auf der Github-Problemliste gefunden und ich denke, dies beantwortet Ihre Frage wirklich.
Von https://github.com/fabric/fabric/issues/395
quelle