J'ai essayé de démarrer un script shell via une session distante, qui démarre un processus en arrière-plan à l'aide de la commande.
nohup python3 run.py > nohup.out &
Lorsque la session distante est fermée, le processus est interrompu avec le message:
Signal capté SIGHUP
SIGHUP capturé mais non démonisé. Quitter.
Je ne comprends pas; pourquoi le processus est-il tué lorsqu'il a été démarré en arrière-plan à l'aide de nohup & ?
background-process
nohup
Mani le plus recherché
la source
la source
tmux
et ignorenohup
complètement ou renie ou tâche d'arrière-plan complètement.Réponses:
Votre programme Python se défait
nohup
.nohup
ignore le signal de raccrochage avecSIG_IGN
puis charge en chaîne votre programme dans le même processus.Votre programme Python réinitialise rapidement la gestion du signal pour le signal de raccrochage, en installant son propre gestionnaire de signal. Ce gestionnaire vérifie une fonction interne (qui n'est pas très bien conçue, étant basée sur des hypothèses erronées, si c'est celle que j'ai vue) et décide que la ligne de conduite appropriée à la réception d'un signal de raccrochage consiste à imprimer ce message et sortir.
Votre programme Python par conception n'est pas
nohup
-able. Sur un système avec un shell de contrôle des travaux et une sémantique de session / travail POSIX, vous devez êtredisown
le travail afin que le shell ne le sache jamais pour lui envoyer un signal de raccrochage en premier lieu.(Même cela ne suffit pas sur les systèmes d'exploitation systemd. Parce que les personnes systemd ont fait une petite oreille de porc de leur mécanisme de session de connexion à l'espace utilisateur, vous devez également vous assurer que le mécanisme de systemd qui signale l'arrêt du système, plutôt que de raccrocher, pour les sessions de connexion à chaque déconnexion ne se déclenchent pas non plus.)
Lectures complémentaires
la source
nohup
; n'ont pas trouvé de remèdesetsid nohup python3 run.py > nohup.out &
, setsid a résolu ce problème. Est-ce une bonne approche?