Eu tenho um script bash que inicia um script python3 (vamos chamá-lo startup.sh
), com a linha de chave:
nohup python3 -u <script> &
Quando eu entro ssh
diretamente e chamo esse script, o script python continua sendo executado em segundo plano depois que eu saio. No entanto, quando eu executo isso:
ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "./startup.sh"
O processo termina assim que ssh
terminar de executá-lo e fecha a sessão.
Qual é a diferença entre os dois?
EDIT: O script python está executando um serviço da web via Bottle.
EDIT2: Também tentei criar um script init que chame startup.sh
e execute ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "sudo service start <servicename>"
, mas tenha o mesmo comportamento.
EDIT3: Talvez seja algo mais no script. Aqui está a maior parte do 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: Quando corro a última linha com um sono no 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"
Ele nunca chega echo "Finished"
e vejo a mensagem do servidor Bottle, que nunca vi antes:
Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.
Eu vejo "Concluído" se eu fizer o SSH manualmente e matar o processo pessoalmente.
EDIT5: Utilizando EDIT4, se eu fizer uma solicitação para qualquer terminal, eu recebo uma página de volta, mas o Bottle erro:
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
se você estiver usando Linux ou truss
se estiver executando o Solaris e ver como / por que ele termina. Como por exemplo ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> strace -fo /tmp/debug ./startup.sh
.
&
no final do script de inicialização? A adição de &
remove a dependência da sua sessão ssh de ser o ID pai (quando os IDs pais morrem, seus filhos também). Também acho que essa é uma pergunta duplicada com base neste post anterior. A postagem que enviei para você na frase anterior é uma duplicata desta postagem, que pode fornecer mais detalhes.
nohup ./startup.sh &
antes, mas tinha o mesmo comportamento. startup.sh
já contém um garfo ( nohup python3 -u <script> &
), então tenho certeza de que não preciso bifurcar novamente.