Czy transfer `scp` zamyka się, kiedy zamykam powłokę?

29

Mam scptransfer (z jednego zdalnego serwera na inny), który jest dość duży.

Więc może chcę zamknąć komputer, z którego wykonałem to polecenie, czy to zakończy transfer? Mam sshdostęp do powłoki za pomocą programu Bitwise.

Borut Flis
źródło

Odpowiedzi:

34

Istnieje wiele rozwiązań.

Tło i proces odrzucania

  1. Otwórz terminal ssh na zdalnym serwerze.
  2. Rozpocznij scptransfer jak zwykle.
  3. Proces scp w tle ( Ctrl+ Z, a następnie polecenie bg).
  4. Wyłącz proces w tle ( disown).
  5. Zakończ sesję ( exit), a proces będzie kontynuowany na zdalnym komputerze.

Wadą tego podejścia jest to, że deskryptory plików dla stdout i stderr nadal będą zawierać odniesienia do tty sesji ssh. Z tego powodu terminal może się zawiesić podczas próby wyjścia. Możesz obejść ten problem, pisząc, ~.aby wymusić zamknięcie klienta ssh (sekwencja ucieczki musi podążać za nową linią ... zobacz także ~?). Jeśli proces, który porzucasz, zapisuje na standardowe lub standardowe, proces może zakończyć się przedwcześnie, jeśli bufor tty się przepełni.

Utwórz sesję ekranową i odłącz ją

Za pomocą GNU Screen można utworzyć zdalną sesję terminala, którą można odłączyć i kontynuować na serwerze po wylogowaniu z sesji. Możesz później zalogować się ponownie na serwerze i ponownie dołączyć do sesji.

  1. Zaloguj się do zdalnego serwera przez ssh.
  2. Rozpocząć sesję ekranu screen -D -R <session_name>.
  3. Rozpocznij scptransfer jak zwykle.
  4. Odłącz sesję ekranową za pomocą Ctrl+ Anastępnie d.
  5. Zakończ sesję ssh ( exit)

Aby ponownie dołączyć do sesji:

  1. Zaloguj się do zdalnego serwera przez ssh.
  2. Podłącz ponownie do sesji ekranowej, screen -D -R <session_name>

Uruchom polecenie bez rozłączeń

Zobacz odpowiedź za pomocą nohup.

Użyj harmonogramu zadań

To najlepsze rozwiązanie, jeśli jest to okresowe zadanie, które chcesz zautomatyzować.

Zastosowanie crontab, atlub batchzaplanować przelewu.

Damien - Ceallaigh
źródło
Cześć Damien, dziękuję za niezłą różnorodność odpowiedzi i formatowanie. Chciałem jednak wyjaśnić, dlaczego określiłeś -D -Rflagi na początku screen. Przeczytałem stronę podręcznika i nie pomogło mi to zrozumieć: -D -R Attach here and now. ...
hello_there_andy
@hello_there_andy Podręcznik wyraźnie określa, co robi -DR. Zasadniczo, jeśli masz już uruchomioną sesję Screen, przyłączy się ona do niej, zamiast tworzyć nową sesję (nawet jeśli użytkownik jest zalogowany do niej przez SSH - wyrzuci je, co jest przydatne, jeśli użytkownik się zawiesił z powodu do złego połączenia sieciowego.)
Damien Ó Ceallaigh
1
Pamiętaj, że określenie nazwy sesji jest opcjonalne.
Damien Ó Ceallaigh,
Ok, myślę, że rozumiem, ale myślę, że myślałem (może niesłusznie), co to screen -r <session>zrobiło ... więc -DRróżni się to tylko -rtym, że może je wyrzucić? Nie tylko podłącz ponownie i nie powiedzie się, jeśli jest na nim inny użytkownik.
hello_there_andy
Dla pewności wykonałem kilka testów. -D robi to, co robi -d, z wyjątkiem tego, że zamyka także połączenie SSH (wylogowuje użytkownika), a także po prostu odłącza wszelkie istniejące sesje Screen. -r ponownie dołącza sesję. -R ponownie przyłącza istniejącą sesję, ale utworzy nową, jeśli taka nie istnieje (-r nie powiedzie się, jeśli nie ma sesji, do której można się ponownie podłączyć). Tak więc w poprzednim opisie byłem nieco niedokładny.
Damien Ó Ceallaigh,
10

Można użyć nohup(1), czyli zrobić coś takiego:

nohup scp alice@source:/the/answer/of/all [email protected]:/var/tmp/42 &

Spowoduje to utworzenie wyniku nohup.out. Następnie możesz bezpiecznie się wylogować.

vonbrand
źródło
Na &końcu zrobiła to dla mnie różnica! Dzięki!
winklerrr
6

Tak, zostanie zakończone. Rozwiązaniem umożliwiającym utrzymanie sesji terminalu przy życiu bez łączności jest screenprogram:

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.
Serge
źródło
2

Jak wspomniano powyżej, możesz użyć polecenia screen, na przykład:

  • Utwórz ekran

user@server:~$ screen -S bigscptransfer

  • Jesteś teraz na ekranie

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

  • Odłącz od ekranu za pomocą CTRL+, Aa następnie naciśnijD

[detached from 5899.bigscptransfer]

  • Wznów sesję, gdy jej potrzebujesz:

user@server:~$ screen -r bigscptransfer

victorcete
źródło
-1

nohup scp shinto @ źródło: / home / data [email protected]: / var / tmp / file

zatrzymaj tymczasowo polecenie za pomocą

CTRL + z

umieść w tle polecenie, wpisz:

bg

możesz sprawdzić proces za pomocą:

Oferty pracy

SHINTO ROOSE PRELATE
źródło