Was ist die beste Methode, um einen Remote-Befehl ssh im Hintergrund auszuführen und dennoch anzuzeigen?

14

Ich muss SSH-Befehle remote ausführen, wobei die Ausgabe lokal angezeigt wird. Aber wenn die Verbindung unterbrochen wird, soll der Befehl weiterhin ausgeführt werden.

Ich spreche nicht so viel über das Einloggen und Ausführen, sondern mache ssh user @ remotehost 'commands && command etc'

Wie kann ich sicherstellen, dass der Befehl auch dann ausgeführt wird, wenn die Verbindung unterbrochen wird?

vfclists
quelle

Antworten:

26

Der beste Weg, dies zu tun, ist die Verwendung des Bildschirms, mit dem die Sitzung dauerhaft geöffnet bleibt, auch wenn die Verbindung unterbrochen wird (und wenn Sie sie wieder verwenden möchten, können Sie eine ausführen, screen -rund sie wird erneut geöffnet).

Das Präfixieren des Befehls, mit dem Sie den Befehl ausführen möchten screen(z. B. ssh -t user@host screen command), sollte die Aufgabe übernehmen.

Wenn Sie möchten, dass es im Hintergrund der Shell ausgeführt wird, können Sie auch ein &an das Ganze anhängen .

Falcon Momot
quelle
Sie müssen wahrscheinlich ssh -t verwenden, um ein Terminal zuzuweisen, in dem der Befehl ausgeführt werden soll. Andernfalls lautet der Fehler "Muss mit einem Terminal verbunden sein".
Bonsaiviking
11

Suchen Sie nach einer dauerhaften Sitzung, die Sie fortsetzen können, oder möchten Sie nur verhindern, dass eine Unterbrechung die Exektion tötet?

Verwenden Sie screenfür die ersteren, für die letzteren nohup,.

Shane Madden
quelle
7

Wie bereits erwähnt, screenkann das den ganzen Trick machen. Aber nicht nur was Sie brauchen. Ich benutze den Bildschirm seit Jahren und benutze ihn jetzt jedes Mal, wenn ich mich bei Systemen anmelde. Versuchen Sie screen, ~/.screenrcmit einer solchen Konfiguration zu installieren und zu erstellen :

sessionname     vcflists
startup_message off
deflogin        off
vbell           off
msgminwait      0
msgwait         10
log             off
backtick        1 0 0 hostname
caption splitonly "%?%F%{= yk}%:%{= Kk}%? %n %t%="
hardstatus alwayslastline "%{= rY}  %1`  %{= kg} %0c %{= bY}  %-w%{= Yk} %n %t %{-}%+w %=%{g}%l "

Dann lauf screen -Rd vcf. Dies ist der bevorzugte Aufruf von screen. Sie stellen die Verbindung zu einer zuvor erstellten Sitzung mit dem Namen vcf * wieder her (oder werden gewarnt, wenn sie nicht eindeutig ist). Wenn die Sitzung noch nicht geöffnet ist, wird sie erstellt. CTRL+ Aist ein Metaschlüssel, der alles kann. CTRL+A C( CTRL+ A, dann C) neues Fenster (Bildschirm) innerhalb der Sitzung erstellen. CTRL+A SPACEBewegen Sie den Fokus zum nächsten Fenster in einer Runde. CTRL+A DTrennen Sie die aktuelle Sitzung, damit alle Fenster zwischen den Verbindungen funktionsfähig bleiben. Wenn Sie eine lange Aufgabe gestartet haben, können Sie die Verbindung zum Bildschirm trennen und später erneut herstellen, um zu sehen, was passiert. Das gleiche passiert, wenn Ihre SSH-Sitzung verloren geht - der Bildschirm bleibt mit allen geöffneten Fenstern und allen gestarteten Aufgaben am Leben.

Wenn Sie ein Fenster innerhalb des Bildschirms schließen möchten - einfach exitvon der Shell aus. Wenn Sie alle Shells / Tasks in allen Fenstern schließen und den Bildschirm beenden möchten, drücken Sie einfach CTRL+A CTRL+\und drücken Sie "Y", wenn Sie dazu aufgefordert werden.

Für den Rest siehe man screen.

Kondybas
quelle
2

Ich habe diese Alternative zu einer zuverlässigen ssh "like" -Verbindung gesehen:

http://mosh.mit.edu/

Rodrigo Prior Bechelli
quelle
Mosh (mobile shell) sieht auf der Website wie ein vielversprechendes neues Tool aus. Es ist allerdings sehr neu.
BGVAUGHAN
1

Ich würde normalerweise tun:

nohup mycommand &

tail -f nohup.out
Gyin
quelle