Tl; dr:
Pourquoi le sleepprocessus peut-il survivre lorsque je me déconnecte et que le terminal est fermé? Dans mon esprit, tout sauf les démons et les nohupprogrammes sera tué lors de la déconnexion. Si sleeppeut survivre de cette façon, cela signifie-t-il que je peux utiliser cette méthode à la place de la nohupcommande?
À moins que l' bashinstance engendrée par sshn'ait l' huponexitoption définie, aucun processus ne sera interrompu de quelque manière que ce soit à la sortie / déconnexion, et lorsque l' huponexitoption est définie, l'utilisation kill -9sur le shell n'est pas une bonne alternative à l'utilisation nohupsur les processus enfants du shell; nohupsur le shell, les processus enfants les protégeront toujours contre les SIGHUP qui ne proviennent pas du shell, et même lorsque cela n'est pas important, il nohupfaut toujours le préférer car cela permet de terminer le shell avec élégance.
Il bashy a une option appelée huponexitqui, si elle est définie, fera de bashSIGHUP ses enfants à la sortie / déconnexion;
Dans les bash instances interactives sans connexion , comme dans une bashinstance générée par gnome-terminal, cette option est ignorée; qu'il huponexitsoit réglé ou non, bashles enfants de 'S ne seront jamais SIGHUPpés bashà la sortie;
Dans les instances de connexion interactive bash, comme dans une bashinstance engendrée par ssh, cette option n'est pas ignorée (mais elle n'est pas définie par défaut); s'il huponexitest défini, bashles enfants de SIGHUP seront suivis par bashà la sortie / déconnexion; s'il huponexitn'est bashpas défini , les enfants de ne seront pas SIGHUPped bashà la sortie / déconnexion;
Donc, en général, la fermeture / déconnexion d'une bashinstance de connexion interactive , sauf si l' huponexitoption est définie, ne fera pas du shell SIGHUP ses enfants, et la fermeture / déconnexion d'une bashinstance interactive sans connexion ne fera pas du shell SIGHUP ses enfants indépendamment;
Cela n'est cependant pas pertinent dans ce cas: l'utilisation kill -9 sleepsurvivra malgré tout, car la suppression de son processus parent ( bash) ne laissera aucune chance à ce dernier de faire quoi que ce soit à l'ancien (par exemple, si l' bashinstance actuelle était une bashinstance de connexion) . et l' huponexitoption a été définie, à SIGHUP it).
De plus, contrairement à d'autres signaux (comme un signal SIGHUP envoyé à bash), un signal SIGKILL n'est jamais propagé aux processus enfants d'un processus, il sleepn'est donc même pas tué;
nohupdémarre un processus insensible aux signaux SIGHUP, ce qui est différent; cela empêchera le processus de raccrocher à la réception d'un signal SIGHUP, qui dans ce cas pourrait être reçu par l' bashinstance de connexion interactive au cas où l' huponexitoption aurait été définie et le shell quitté; donc, techniquement, utiliser nohuppour démarrer un processus dans une bashinstance de connexion interactive avec l' huponexitoption unset empêchera le processus de raccrocher à la réception d'un signal SIGHUP, mais quitter / se déconnecter du shell ne le SIGHUP le fera pas indépendamment;
En général, cependant, lorsque cela nohupest nécessaire pour empêcher les signaux SIGHUP provenant du shell parent, il n'y a aucune raison de préférer la kill -9méthode on the parent à la méthode nohupon the child; au contraire, ce devrait être le contraire.
Tuer le parent à l'aide de la kill -9méthode ne laisse aucune chance au parent de sortir avec élégance, tandis que le démarrage de l'enfant à l'aide de la nohupméthode permet au parent d'être interrompu par d'autres signaux, tels que SIGHUP (pour donner un exemple qui a du sens dans le contexte d'un enfant a commencé à utiliser nohup), ce qui lui permet de sortir avec élégance.
&va bifurquer le processus en arrière-plan (comme le démon) et continue de fonctionner même si vous êtes déconnecté.