Ich möchte ein Bash-Skript schreiben, das sich per SSH mit einem Server verbinden, einen kontinuierlichen Hintergrundprozess (unendliches Python-Skript) starten und den Server beenden kann. Folgendes habe ich versucht:
ssh user@domain "python3 script.py &"
ssh user@domain "python3 script.py & exit"
ssh user@domain "nohup python3 script.py & exit"
Keiner von ihnen funktioniert. Das Skript wird erfolgreich gestartet, aber ich kann den Server nicht verlassen und es bleibt angemeldet.
Antwort1
Der nohup
Befehl macht nicht das, was Sie denken – er ignoriert ein Auflegesignal, sodass die (Terminal-)Verbindungen auf STDIO getrennt werden können, ohne dass der Terminaltreiber etwas SIGHUP
an die angeschlossenen Prozesse sendet, nohup
schließt aber seine eigenen STDIO-Verbindungen nicht und gibt sie tatsächlich an den Prozess weiter, den er startet, und sshd
wartet daher, bis der Prozess beendet wird und diese Deskriptoren infolgedessen geschlossen werden.
Sie müssen also sicherstellen, dass der von Ihnen gestartete Prozess auch nicht mit den ihm von gegebenen STDOUT- und STDERR-Deskriptoren verbunden ist sshd
(STDIN ist bereits auf geöffnet /dev/null
), und Sie können dies tun, indem Sie sie umleiten (entweder in eine Datei oder auf /dev/null
). Der nohup
Befehl ist nicht unbedingt erforderlich, da nichts gesendet wird, SIGHUP
wenn die SSH-Verbindung abbricht.
Versuche dies:
ssh user@domain "python3 script >/dev/null 2>&1 &"
Antwort2
Versuchen Sie es mit einem Terminal-Multiplexer. tmux ist großartig. Normalerweise gebe ich nicht gerne Ratschläge, bei denen Sie möglicherweise etwas installieren müssen, aber tmux ist eine wirklich praktische App, die Sie in Ihrem Werkzeugkasten haben sollten. (ist möglicherweise bereits installiert)
Sie können Ihre in tmux verpackte App starten, die Verbindung trennen, Ihren Laptop schließen, woanders hingehen, sich erneut anmelden und die Verbindung zu Ihrer Sitzung, die noch in tmux läuft, wiederherstellen. Wenn Ihr Betriebssystem älter ist, funktioniert screen ähnlich, aber ich bevorzuge tmux.
Sie können eine neue App über die Befehlszeile oder eine App mit folgendem Format starten
tmux neue Sitzung "Befehl1"
tmux new-session "ping 8.8.8.8"
Aber Sie sollten Ihren Sitzungen wahrscheinlich Namen geben. Jetzt wird eine neue Sitzung mit dem Namen muxping im Hintergrund gestartet. Das -d ist getrennt.
tmux new -d -s muxping "ping 8.8.8.8"
jetzt im Hintergrund zeigen
tmux ls
daran anhängen
tmux a
Darüber hinaus können Sie den Bildschirm teilen und viele sehr praktische Dinge in tmux tun. Es gibt viele Websites mit tmux-Spickzetteln, die die große Manpage vereinfachen. Der Einstieg ist ziemlich einfach.