Mam skrypt bash, który uruchamia skrypt python3 (nazwijmy go startup.sh
), z kluczową linią:
nohup python3 -u <script> &
Kiedy wchodzę ssh
bezpośrednio i wywołuję ten skrypt, skrypt Pythona kontynuuje działanie w tle po zakończeniu pracy. Jednak gdy uruchomię to:
ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "./startup.sh"
Proces kończy się, gdy tylko go ssh
zakończy i zakończy sesję.
Jaka jest różnica między nimi?
EDYCJA: Skrypt Pythona uruchamia usługę internetową za pośrednictwem Bottle.
EDIT2: Próbowałem również utworzyć skrypt inicjujący, który wywołuje startup.sh
i ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "sudo service start <servicename>"
działa, ale mam takie samo zachowanie.
EDIT3: Może to coś innego w skrypcie. Oto większość skryptu:
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: Kiedy uruchamiam ostatnią linię ze snem na końcu:
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"
Nigdy nie dociera echo "Finished"
i widzę komunikat serwera butelki, którego nigdy wcześniej nie widziałem:
Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.
Widzę „Zakończone”, jeśli ręcznie SSH i sam zabiję proces.
EDIT5: Korzystając z EDIT4, jeśli poproszę o dowolny punkt końcowy, dostanę stronę z powrotem, ale Butelka popełni błąd:
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
jeśli używasz Linuksa lub truss
Solaris i zobaczysz, jak / dlaczego się kończy. Jak na przykład ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> strace -fo /tmp/debug ./startup.sh
.
&
na końcu skryptu uruchamiania? Dodanie &
zabiera zależność twojej sesji ssh od bycia identyfikatorem nadrzędnym (kiedy umierają identyfikatory nadrzędne, to także ich dzieci). Myślę też, że jest to duplikat pytania w oparciu o ten poprzedni post. Post, który przesłałem do ciebie w poprzednim zdaniu, jest duplikatem tego postu, który może zawierać więcej szczegółów.
nohup ./startup.sh &
wcześniej, ale miało to to samo zachowanie. startup.sh
zawiera już widelec ( nohup python3 -u <script> &
), więc jestem prawie pewien, że nie muszę ponownie rozwidlać.