Schließt ein "scp" -Transfer, wenn ich die Shell schließe?


29

Ich habe eine scpÜbertragung (von einem Remote-Server zu einem anderen), das ist ziemlich groß.

Vielleicht möchte ich den Computer schließen, von dem aus ich diesen Befehl ausgeführt habe. Beendet dies die Übertragung? Ich habe sshZugriff auf die Shell mit dem Programm Bitwise.

Antworten:


34

Es gibt eine Reihe von Lösungen.

Hintergrund & den Prozess ablehnen

  1. Öffnen Sie das ssh-Terminal für den Remote-Server.
  2. Beginnen Sie den scpTransfer wie gewohnt.
  3. Hintergrund den SCP-Prozess ( Ctrl+ Z, dann den Befehl bg.)
  4. Den Hintergrundprozess ablehnen ( disown).
  5. Beenden Sie die Sitzung ( exit) und der Prozess wird auf dem Remote-Computer weiter ausgeführt.

Ein Nachteil dieses Ansatzes ist, dass die Dateideskriptoren für stdout und stderr weiterhin Verweise auf die tty Ihrer ssh-Sitzung enthalten. Das Terminal hängt möglicherweise, wenn Sie versuchen, aus diesem Grund zu beenden. Sie können dies umgehen ~., indem Sie Folgendes eingeben , um das Schließen Ihres ssh-Clients zu erzwingen (diese Escape-Sequenz muss einer neuen Zeile folgen ... siehe auch ~?). Wenn der Prozess, den Sie verlassen, in stdout oder stderr schreibt, wird der Prozess möglicherweise vorzeitig beendet, wenn der tty-Puffer überfüllt ist.

Erstellen Sie eine Bildschirmsitzung und trennen Sie sie

GNU Screen kann verwendet werden, um eine Remote-Terminal-Sitzung zu erstellen, die getrennt werden kann und auf dem Server weiter ausgeführt werden kann, nachdem Sie sich von der Sitzung abgemeldet haben. Sie können sich dann zu einem späteren Zeitpunkt wieder beim Server anmelden und eine neue Verbindung zur Sitzung herstellen.

  1. Melden Sie sich über ssh beim Remote-Server an.
  2. Starten Sie eine Bildschirmsitzung screen -D -R <session_name>.
  3. Beginnen Sie den scpTransfer wie gewohnt.
  4. Trennen Sie die Bildschirmsitzung mit Ctrl+ und Adann d.
  5. Beende die ssh Session ( exit)

So fügen Sie die Sitzung erneut hinzu:

  1. Melden Sie sich über ssh beim Remote-Server an.
  2. Verbinden Sie sich wieder mit der Bildschirmsitzung, screen -D -R <session_name>

Führen Sie den Befehl ohne Auflegen aus

Sehen Sie die Antwort mit nohup.

Verwenden Sie einen Taskplaner

Dies ist die beste Lösung, wenn es sich um eine regelmäßige Aufgabe handelt, die Sie automatisieren möchten.

Verwendung crontab, atoder batchdie Übertragung zu planen.


Hallo Damien, danke für die nette Auswahl an Antworten und Formatierungen. Aber ich wollte etwas Klarheit darüber, warum Sie die -D -Rstartenden Flags angegeben haben screen. Ich habe die Manpage gelesen und es hat mir nicht geholfen zu verstehen: -D -R Attach here and now. ...
hello_there_andy

@hello_there_andy Das Handbuch gibt deutlich an, was -DR macht. Wenn bereits eine Screen-Sitzung ausgeführt wird, wird sie erneut angefügt, anstatt eine neue Sitzung zu erstellen (auch wenn ein Benutzer über SSH angemeldet ist - sie wird herausgeschmissen, was nützlich ist, wenn der Benutzer aufgrund von Problemen hängt zu einer schlechten Netzwerkverbindung.)
Damien Ó Ceallaigh

1
Beachten Sie, dass die Angabe eines Sitzungsnamens optional ist.
Damien Ó Ceallaigh

Ok, ich glaube, ich verstehe, aber ich glaube, ich dachte (vielleicht falsch), das hat was gebracht screen -r <session>... also -DRist das anders als nur -rdarin, dass es sie rausschmeißen kann? Nicht nur neu anfügen und fehlschlagen, wenn ein anderer Benutzer daran beteiligt ist.
Hallo_Hier_undy

Ich habe einige Tests durchgeführt, um sicherzugehen. -D macht das, was -d macht, außer dass es auch die SSH-Verbindung schließt (den Benutzer abmeldet) und nur vorhandene Bildschirmsitzungen trennt. -r Hängt die Sitzung erneut an. -R fügt eine vorhandene Sitzung erneut hinzu, erstellt jedoch eine neue Sitzung, wenn keine vorhanden ist (-r schlägt fehl, wenn keine Sitzung zum erneuten Anfügen vorhanden ist.) Daher war ich in meiner vorherigen Beschreibung etwas ungenau.
Damien Ó Ceallaigh

10

Sie könnten zB nohup(1)Folgendes tun:

nohup scp alice@source:/the/answer/of/all bob@target.example.com:/var/tmp/42 &

Dies erzeugt eine Ausgabe von nohup.out. Dann können Sie sich sicher abmelden.


Das &am Ende hat für mich den Unterschied gemacht! Vielen Dank!
Winklerrr

6

Ja, es wird beendet. Die Lösung, um die Terminalsitzung ohne Konnektivität am Leben zu erhalten, ist das screenProgramm:

SCREEN(1)                                                            SCREEN(1)

NAME
       screen - screen manager with VT100/ANSI terminal emulation

SYNOPSIS
       screen [ -options ] [ cmd [ args ] ]
       screen -r [[pid.]tty[.host]]
       screen -r sessionowner/[[pid.]tty[.host]]

DESCRIPTION
       Screen is a full-screen window manager that multiplexes a physical ter‐
       minal between several processes (typically interactive  shells).   Each
       virtual terminal provides the functions of a DEC VT100 terminal and, in
       addition, several control functions from the ISO 6429  (ECMA  48,  ANSI
       X3.64)  and ISO 2022 standards (e.g. insert/delete line and support for
       multiple character sets).  There is a  scrollback  history  buffer  for
       each virtual terminal and a copy-and-paste mechanism that allows moving
       text regions between windows.

2

Wie oben erwähnt, können Sie den Befehl screen verwenden, zum Beispiel:

  • Bildschirm erstellen

user@server:~$ screen -S bigscptransfer

  • Sie befinden sich jetzt auf dem Bildschirm

ser@server:~$ scp bigfile.dat server2:.

  • Mit CTRL+ vom Bildschirm lösen und Adann drückenD

[detached from 5899.bigscptransfer]

  • Setzen Sie die Sitzung fort, wenn Sie sie benötigen:

user@server:~$ screen -r bigscptransfer


-1

nohup scp shinto @ source: / home / data roose@target.example.com: / var / tmp / file

stoppe vorübergehend den befehl mit

STRG + z

Setzen Sie den Befehl in den Hintergrund und geben Sie Folgendes ein:

bg

Sie können den Prozess überprüfen mit:

Arbeitsplätze

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.