Führen Sie einen Befehl nohup über SSH aus und trennen Sie dann die Verbindung

46

Ich möchte ein Skript start.shauf einem Remote-Server ausführen, auf dem Folgendes ausgeführt wird:

nohup node server.js &

Naiv nenne ich SSH so:

ssh myserver <<EOF
./start.sh &
EOF

Dadurch wird das Skript gestartet, die Sitzung bleibt jedoch verbunden. Ich möchte diesen Schritt mit anderen Befehlen in einem Skript ausführen, das ist also nicht gut.

Wie kann ich eine SSH-Verbindung zum Remote-Computer herstellen, einen nohupBefehl im Hintergrund starten und dann die Verbindung trennen? Ich nehme an, ich könnte den SSH-Prozess selbst in den Hintergrund stellen, aber das scheint nicht richtig zu sein.

Steve Bennett
quelle

Antworten:

40

Sie haben bereits den richtigen Weg gefunden, hier dokumentieren.

HINWEIS : Sie können den ssh (Client) in den Hintergrund stellen, indem Sie ein & am Ende einfügen. Die Ausgabe wird jedoch nicht angezeigt. Wenn Sie dies wirklich tun möchten, leiten Sie stdout / stderr in eine Datei um, falls Sie die Antwort vom Remote-Host überprüfen müssen.

Grundsätzlich können Sie es auf beide Arten tun:

Führe den Befehl {, s} direkt aus

ssh user@host "nohup command1 > /dev/null 2>&1 &; nohup command2; command3"

ODER

ssh user@host "$(nohup command1 > /dev/null 2>&1 &) && nohup command2 >> /path/to/log 2>&1 &"

HINWEIS : &&Der erste Befehl muss 0 zurückgeben, bevor der zweite ausgeführt wird

Dokument hier verwenden

ssh user@host << EOF
nohup command1 > /dev/null 2>&1 &
nohup command2 >> /path/to/command2.log 2>&1 &
......
EOF

Die oben genannten 3 Optionen sollten für Sie funktionieren.

Schauen Sie sich auch die Antwort hier an: https://askubuntu.com/a/348921/70270

Terry Wang
quelle
Danke - also das bisschen was mir gefehlt hat war wirklich das > /dev/null.
Steve Bennett
Nicht wirklich, > /dev/null 2>&1ist es, jede Ausgabe von stdout / stderr durch Weiterleiten an das Schwarze Loch zu verwerfen lol
Terry Wang
5
Beachten Sie, dass ich vorschlagen würde, >> anstelle von nur> zu verwenden, um in Protokolldateien zu schreiben. Andernfalls erhalten Sie nur die Fehler vom allerletzten Lauf.
Alexis Wilke
Ist es richtig, nohup command2 >> /path/to/command2.log 2>&1 &dass der Prozess verloren geht, wenn ich einfach einen Befehl wie in einem Terminal starte und dann das Terminal schließe?
Luke
1
@ TerryWang Das zweite Beispiel funktioniert nicht mit kaufmännischem und, gefolgt von doppeltem kaufmännischem und. Siehe unix.stackexchange.com/q/67006/86716
tsionyx
7

Warum nicht einfach tmux oder screen und fertig? Zum Beispiel:

$ tmux new -s SessionNameHere
$ nohup /path/to/your/script.sh

Dies ist praktisch, wenn eine Endlosschleife ausgeführt wird oder eine Weile dauert. Sie können die Sitzung trennen und sie bleibt aktiv.

Anon
quelle
2
Passt nicht wirklich zu meinen Anforderungen. Dies ist ein einzelner Befehl, der auf meinem Laptop ausgeführt werden kann. Er stellt eine Verbindung her, gibt einen Befehl aus und trennt dann die Verbindung.
Steve Bennett
3
ssh node "nohup sleep 10 &"

läuft nicht im Daemon-Modus und hält Ihre SSH-Sitzung in Verbindung. Die SSH-Sitzung kehrt in 10 Sekunden zurück, obwohl Sie nohup verwendet haben.

Grund dafür ist, dass stdout und stderr weiterhin mit Ihrer Sitzung verbunden sind. Es hält die ssh-Sitzung am Leben, nohup hilft nicht.

Diese:

ssh node "nohup sleep 10 1>/dev/null 2>/dev/null &"

kehrt sofort zurück. Es startet den Remote-Prozess mit nohup und beendet die ssh-Sitzung sofort.

Sergey Cherepanov
quelle
Das war genau unser Problem. Wir hatten nur eine 1> file.log. Das SSH auf der einen Maschine steckte fest. Der Prozess auf dem 'Knoten'-Computer wurde ausgeführt. Wenn wir kurz vor dem Schließen & eine 2> & 1 hinzugefügt haben, hat das ssh die Verbindung getrennt.
Lee Meador
2

Kürzere Form:

ssh host "(command 1; command 2; ...) &>/dev/null &"

Es scheint, dass die Bash selbst das Trennen vom Terminal durchführt, sodass kein Nohup erforderlich ist. Ich starte Ubuntu 14.04 x86_64, bash 4.3.11.

Alek_A
quelle
1
Dies gibt keine Antwort auf die Frage. Wenn Sie einen Autor kritisieren oder um Klärung bitten möchten, hinterlassen Sie einen Kommentar unter seinem Beitrag. Sie können jederzeit Ihre eigenen Beiträge kommentieren. Wenn Sie über eine ausreichende Reputation verfügen, können Sie jeden Beitrag kommentieren . - Aus der Bewertung
David Foerster
Das scheint nicht zu funktionieren. nohup; gibt nur eine Beschwerde über fehlende Argumente aus.
Steve Bennett
@DavidFoerster, keine Ahnung wieso, wenn man command 1; command 2; ...Script-OP ausführen möchte. OP kann auch Sonderfälle dieser Antwort verwenden:ssh myserver ./start.sh &>/dev/null &
Alek_A