Ho uno script bash che avvia uno script python3 (chiamiamolo startup.sh
), con la linea chiave:
nohup python3 -u <script> &
Quando ssh
entro direttamente e chiamo questo script, lo script Python continua a essere eseguito in background dopo che esco. Tuttavia, quando eseguo questo:
ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "./startup.sh"
Il processo termina non appena ssh
termina l'esecuzione e chiude la sessione.
Qual è la differenza tra i due?
EDIT: lo script python esegue un servizio web tramite Bottle.
EDIT2: ho anche provato a creare uno script init che chiama startup.sh
ed è in esecuzione ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "sudo service start <servicename>"
, ma ha avuto lo stesso comportamento.
EDIT3: Forse è qualcos'altro nella sceneggiatura. Ecco la maggior parte dello 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 eseguo l'ultima riga con un sonno alla fine:
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"
Non arriva mai echo "Finished"
e vedo il messaggio del Bottle Server, che non avevo mai visto prima:
Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.
Vedo "Fine" se inserisco manualmente SSH e interrompo il processo da solo.
EDIT5: Utilizzando EDIT4, se invio una richiesta a qualsiasi endpoint, ottengo una pagina indietro, ma gli errori Bottle:
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 stai usando Linux o truss
se stai eseguendo Solaris e vedi come / perché termina. Come per esempio ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> strace -fo /tmp/debug ./startup.sh
.
&
alla fine dello script di avvio? L'aggiunta di &
toglie la dipendenza della sessione ssh dall'essere l'id genitore (quando gli id genitore muoiono, così fanno i loro figli). Inoltre penso che questa sia una domanda duplicata basata su questo post precedente. Il post che ti ho inviato nella frase precedente è un duplicato di questo post che potrebbe fornire dettagli migliori.
nohup ./startup.sh &
prima, ma aveva lo stesso comportamento. startup.sh
contiene già un fork ( nohup python3 -u <script> &
), quindi sono abbastanza sicuro di non aver bisogno di fork di nuovo.