J'ai un script bash qui démarre un script python3 (appelons-le startup.sh
), avec la ligne de clé:
nohup python3 -u <script> &
Lorsque j'entre ssh
directement et appelle ce script, le script python continue de s'exécuter en arrière-plan après ma sortie. Cependant, lorsque je lance ceci:
ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "./startup.sh"
Le processus se termine dès qu'il ssh
a fini de l'exécuter et ferme la session.
Quelle est la différence entre les deux?
EDIT: Le script python exécute un service Web via Bottle.
EDIT2: J'ai également essayé de créer un script d'initialisation qui appelle startup.sh
et s'exécute ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "sudo service start <servicename>"
, mais obtient le même comportement.
EDIT3: C'est peut-être autre chose dans le script. Voici l'essentiel du script:
chmod 700 ${key_loc}
echo "INFO: Syncing files."
rsync -azP -e "ssh -i ${key_loc} -o StrictHostKeyChecking=no" ${source_client_loc} ${remote_user}@${remote_hostname}:${destination_client_loc}
echo "INFO: Running startup script."
ssh -i ${key_loc} -o StrictHostKeyChecking=no ${remote_user}@${remote_hostname} "cd ${destination_client_loc}; chmod u+x ${ctl_script}; ./${ctl_script} restart"
EDIT4: Lorsque je lance la dernière ligne avec un sommeil à la fin:
ssh -i ${key_loc} -o StrictHostKeyChecking=no ${remote_user}@${remote_hostname} "cd ${destination_client_loc}; chmod u+x ${ctl_script}; ./${ctl_script} restart; sleep 1"
echo "Finished"
Il n'atteint jamais echo "Finished"
, et je vois le message du serveur de bouteille, que je n'ai jamais vu auparavant:
Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.
Je vois "Terminé" si j'ouvre manuellement SSH et tue le processus moi-même.
EDIT5: En utilisant EDIT4, si je fais une demande à n'importe quel point de terminaison, je récupère une page, mais les erreurs de bouteille sortent:
Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.
----------------------------------------
Exception happened during processing of request from ('<IP>', 55104)
strace
si vous utilisez Linux ou truss
si vous exécutez Solaris et voyez comment / pourquoi il se termine. Comme par exemple ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> strace -fo /tmp/debug ./startup.sh
.
&
à la fin du script de démarrage? L'ajout du &
supprime la dépendance de votre session ssh d'être l'ID parent (lorsque les ID parents meurent, leurs enfants aussi). Je pense également que c'est une question en double basée sur ce post précédent. Le message que je vous ai soumis dans la phrase précédente est un double de ce message qui pourrait fournir de meilleurs détails.
nohup ./startup.sh &
, mais il avait le même comportement. startup.sh
contient déjà un fork ( nohup python3 -u <script> &
), donc je suis sûr que je n'ai pas besoin de fork encore.