Citant la documentation bash (de 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.
Donc, tout simplement dit, avoir set -m
(la valeur par défaut pour les shells interactifs) permet d'utiliser des éléments intégrés tels que fg
et bg
, qui seraient désactivés sous set +m
(la valeur par défaut pour les shells non interactifs).
Cependant, il n'est pas évident pour moi quelle est la connexion entre le contrôle des travaux et la suppression des processus d'arrière-plan à la sortie, mais je peux en confirmer qu'il y en a un: l'exécution set -m; (sleep 10 ; touch control-on) &
créera le fichier si l'on quitte le shell juste après avoir tapé cette commande, mais set +m; (sleep 10 ; touch control-off) &
ne le fera pas.
Je pense que la réponse réside dans le reste de la documentation pour 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.
Cela signifie que les jobs d'arrière-plan démarrés sous set +m
ne sont pas de véritables "processus d'arrière-plan" ("les processus d'arrière-plan sont ceux dont l'ID de groupe de processus diffère de celui du terminal"): ils partagent le même ID de groupe de processus que le shell qui les a démarrés, plutôt que d'avoir leur propre groupe de processus comme les processus d'arrière-plan appropriés. Cela explique le comportement observé lorsque le shell se ferme avant certains de ses jobs d'arrière-plan: si je comprends bien, lors de la fermeture, un signal est envoyé aux processus dans le même groupe de processus que le shell (tuant ainsi les jobs d'arrière-plan démarrés sous set +m
), mais pas à ceux d'autres groupes de processus (laissant ainsi seuls les véritables processus d'arrière-plan commencés set -m
).
Donc, dans votre cas, le startup.sh
script démarre probablement un travail d'arrière-plan. Lorsque ce script est exécuté de manière non interactive, comme sur SSH comme dans la question à laquelle vous avez lié, le contrôle des travaux est désactivé, le travail "d'arrière-plan" partage le groupe de processus du shell distant et est donc tué dès que le shell se ferme. Inversement, en activant le contrôle des travaux dans ce shell, le travail d'arrière-plan acquiert son propre groupe de processus et n'est pas tué lorsque son shell parent se ferme.
tomcat/bin/startup.sh
lien avecfg
/bg
?Je l'ai trouvé sur la liste des problèmes de github, et je pense que cela répond vraiment à votre question.
Depuis https://github.com/fabric/fabric/issues/395
la source