Ich habe ein Bash-Skript, das ein Python3-Skript startet (nennen wir es startup.sh
), mit der folgenden Schlüsselzeile:
nohup python3 -u <script> &
Wenn ich ssh
direkt in dieses Skript einsteige und es aufrufe, läuft das Python-Skript nach dem Beenden im Hintergrund weiter. Wenn ich dies jedoch ausführe:
ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "./startup.sh"
Der Vorgang endet, sobald ssh
die Ausführung beendet ist und die Sitzung geschlossen wurde.
Was ist der Unterschied zwischen den beiden?
BEARBEITEN: Das Python-Skript führt einen Webdienst über Bottle aus.
EDIT2: Ich habe auch versucht , ein Init-Skript zu erstellen , das aufruft startup.sh
und ausgeführt wird ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "sudo service start <servicename>"
, aber das gleiche Verhalten hat.
EDIT3: Vielleicht ist es etwas anderes im Skript. Hier ist der Großteil des Skripts:
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: Wenn ich die letzte Zeile mit einem Schlaf am Ende laufen lasse:
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"
Es erreicht nie echo "Finished"
, und ich sehe die Flaschen-Server-Nachricht, die ich noch nie gesehen habe:
Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.
Ich sehe "Fertig", wenn ich manuell SSH einsetze und den Vorgang selbst beende.
EDIT5: Wenn ich mit EDIT4 eine Anfrage an einen Endpunkt stelle, erhalte ich eine Seite zurück, aber die Flasche zeigt Fehler an:
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
Linux oder truss
unter Solaris auszuführen und zu sehen, wie / warum es beendet wird. Wie zum Beispiel ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> strace -fo /tmp/debug ./startup.sh
.
&
Skript am Ende des Startvorgangs zu verwenden? Durch Hinzufügen von &
wird die Abhängigkeit Ihrer ssh-Sitzung von der übergeordneten ID aufgehoben (wenn übergeordnete IDs sterben, werden auch deren untergeordnete IDs gelöscht). Ich denke auch, dass dies eine doppelte Frage ist, die auf diesem vorherigen Beitrag basiert . Der Beitrag, den ich Ihnen im vorherigen Satz übermittelt habe, ist ein Duplikat dieses Beitrags, das möglicherweise detailliertere Informationen enthält.
nohup ./startup.sh &
, aber es hatte das gleiche Verhalten. startup.sh
Enthält bereits eine Gabel ( nohup python3 -u <script> &
), daher bin ich mir ziemlich sicher, dass ich nicht noch einmal gabeln muss.