Tengo un script bash que inicia un script python3 (llamémoslo startup.sh
), con la línea clave:
nohup python3 -u <script> &
Cuando entro ssh
directamente y llamo a este script, el script de Python continúa ejecutándose en segundo plano después de salir. Sin embargo, cuando ejecuto esto:
ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "./startup.sh"
El proceso termina tan pronto como ssh
haya terminado de ejecutarse y cierra la sesión.
¿Cuál es la diferencia entre los dos?
EDIT: El script en Python, se está ejecutando un servicio web a través de la botella.
EDIT2: también intenté crear un script de inicio que startup.sh
ejecuta y ejecuta ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "sudo service start <servicename>"
, pero obtuve el mismo comportamiento.
EDITAR3: Tal vez sea algo más en el guión. Aquí está la mayor parte del guión:
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: Cuando ejecuto la última línea con un sueño al final:
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"
Nunca llega echo "Finished"
, y veo el mensaje del servidor Botella, que nunca vi antes:
Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.
Veo "Terminado" si manualmente SSH y matar el proceso mismo.
EDIT5: Utilizando EDIT4, si hago una solicitud a cualquier punto final, obtengo una página de regreso, pero los errores de la botella se eliminan:
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 está utilizando Linux o truss
si está ejecutando Solaris y ver cómo / por qué termina. Como por ejemplo ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> strace -fo /tmp/debug ./startup.sh
.
&
al final del script de inicio? Agregar el le &
quita la dependencia de su sesión ssh de ser la identificación principal (cuando los identificadores principales mueren, también lo hacen sus hijos). También creo que esta es una pregunta duplicada basada en esta publicación anterior. La publicación que le envié en la oración anterior es un duplicado de esta publicación que podría proporcionar mejores detalles.
nohup ./startup.sh &
antes, pero tuvo el mismo comportamiento. startup.sh
ya contiene un tenedor ( nohup python3 -u <script> &
), así que estoy bastante seguro de que no necesito bifurcar nuevamente.