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.

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.


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 bob@target.example.com:/var/tmp/42 &

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


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.

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


-1

nohup scp shinto @ źródło: / home / data roose@target.example.com: / var / tmp / file

zatrzymaj tymczasowo polecenie za pomocą

CTRL + z

umieść w tle polecenie, wpisz:

bg

możesz sprawdzić proces za pomocą:

Oferty pracy

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.