Pourquoi les processus d'arrière-plan Unix meurent-ils parfois lorsque je quitte mon shell?
Je voulais savoir pourquoi je vois un comportement différent dans le processus d'arrière-plan dans le shell Bash
Cas 1: Connecté à un serveur Unix à l'aide de Mastic(SSH)
- Par défaut, il utilise le shell csh
- J'ai changé pour shell bash
- tapé sommeil 2000 &
- appuyez sur entrée
Il m'a donné le numéro de job. Maintenant j'ai tué ma session en cliquant sur le x dans la fenêtre de putty
Maintenant, ouvrez une autre session et a essayé de rechercher le processus..le processus de mort.
Cas 2:Cas 1: Connecté à un serveur Unix à l'aide de Mastic(SSH)
Par défaut, il utilise le shell csh
- J'ai changé pour shell bash
- vi mysleep.sh
- sommeil 2000 & Sauvé mysleep.sh
- ./mysleep.sh
Diff est ici..au lieu de l'exécution de la commande de mise en veille directement, je suis le stockage de la commande de mise en veille dans un fichier et exécuter le fichier.
Maintenant j'ai tué ma session en cliquant sur le x dans la fenêtre de putty
Maintenant, ouvrez une autre session et a essayé de rechercher le processus..le processus est toujours là
Pas sûr de savoir pourquoi cela se passe. J'ai pensé que j'ai besoin de faire désavouer en bash pour lancer le processus, même après la déconnexion.
Une diff je vois dans le parent de l'id de processus..Dans le second cas..le parent id de processus pour le sommeil 2000 devient 1. Ressemble dès que le processus de mysleep.sh décédé le noyau affecté le processus parent à 1.
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
La différence ici, c'est en effet l'intervention de processus.
Lorsque vous fermez la fenêtre du terminal, un signal HUP (liées à la "nohup" comme an0nymo0usc0ward mentionné) est envoyé au processus en cours d'exécution. L'action par défaut sur la réception du signal HUP est à mourir - à partir du signal(3) page de manuel,
Dans votre premier exemple, le processus de sommeil directement reçoit ce signal HUP et meurt parce qu'il n'est pas de faire autre chose. (Certains procédés de capture HUP et l'utiliser pour effectuer une action, par exemple, relire certains fichiers de configuration)
Dans le deuxième exemple, le shell processus de l'exécution de votre script shell est déjà mort, de sorte que le processus de sommeil n'est jamais le signal. Sous UNIX, chaque processus doit avoir un processus parent en raison de la structure interne de la façon dont le wait(2) de la famille des appels fonctionne et en effet les processus en général. Alors, quand la mère meurt, le noyau donne à init (pid 1, comme vous le notez) comme un enfant en famille d'accueil.
Orphelin processus (sur wikipedia) a certains plus d'informations disponibles à ce sujet, voir également Zombie processus pour certains des détails techniques supplémentaires.
Déjà en cours d'exécution?
^z
bg
renier %
<jobid>
De nouveaux processus/script (sur l'ordinateur local de la console)?
nohup script.sh &
De nouveaux processus/script (sur la machine distante console)?
Selon votre besoin,
il y a deux options [ il y en aura plus 😉 ]
ssh remotehost 'nohup /path/to/script.sh
</dev/null
> nohup.2>,&1 &"OU
utiliser un 'screen'
Essayer "nohup cmd args..."
Steven réponse est bonne, mais je tiens à mettre en évidence la partie la plus délicate encore ici:
=> à l'Aide d'un script bash qui vient s'exécute dormir dans le fond
L'effet de ceci est que le "script" quitte presque immédiatement (car il fait toutes ses commandes). Cependant, elle a créé un processus enfant (sommeil) pendant sa durée de vie. L'effet de ceci est que:
Noter que ce genre de choses se passe lorsque vous avez exécuté le script, et n'a rien à voir avec une quelconque ssh déconnexion/mastic de clôture.
Quand finalement, vous vous fermez votre session putty, bash reçoit un signal SIGHUP", mais ne pas le transmettre à tout autre processus (car il n'y a pas d'emplois à gauche)
Dans les autres cas, bash n'ont encore un emploi, gauche, qu'il a ensuite envoyé le signal SIGHUP à, provoquant la fin (comme vous l'avez remarqué)
Espère que cette aide