Передается ли `scp`, когда я закрываю оболочку?


29

У меня есть scpпередача (с одного удаленного сервера на другой), это довольно большой.

Поэтому, может быть, я хочу закрыть компьютер, с которого я выполнил эту команду, закончится ли передача? У меня есть sshдоступ к оболочке с помощью программы Bitwise.

Ответы:


34

Есть ряд решений.

Фон и отречься от процесса

  1. Откройте терминал ssh для удаленного сервера.
  2. Начните scpперевод как обычно.
  3. Фоновый процесс scp ( Ctrl+ Z, затем команда bg.)
  4. Отказаться от фонового процесса ( disown).
  5. Завершите сеанс ( exit), и процесс продолжится на удаленной машине.

Одним из недостатков этого подхода является то, что файловые дескрипторы для stdout и stderr будут по-прежнему содержать ссылки на tty вашей сессии ssh. Терминал может зависнуть при попытке выйти из-за этого. Вы можете обойти это, набрав команду ~.принудительно закрыть ваш ssh-клиент (эта escape-последовательность должна следовать за новой строкой ... см. Также ~?). Если процесс, от которого вы отказываетесь, записывает данные в stdout или stderr, процесс может преждевременно завершиться, если переполнен буфер tty.

Создайте сеанс экрана и отсоедините его

Экран GNU можно использовать для создания сеанса удаленного терминала, который можно отсоединить и продолжить работу на сервере после выхода из сеанса. Затем вы можете снова войти на сервер и подключиться к сеансу.

  1. Войдите на удаленный сервер через ssh.
  2. Начать сеанс экрана screen -D -R <session_name>.
  3. Начните scpперевод как обычно.
  4. Отключите сеанс экрана с помощью Ctrl+ Aзатем d.
  5. Завершить сеанс SSH ( exit)

Чтобы присоединить к сеансу:

  1. Войдите на удаленный сервер через ssh.
  2. Прикрепите к экрану сеанса, screen -D -R <session_name>

Запустить команду без зависаний

Смотрите ответ, используя nohup.

Используйте планировщик задач

Это лучшее решение, если это периодическая задача, которую вы хотите автоматизировать.

Используйте crontab, atили batchзапланировать передачу.


Привет Дэмиен, спасибо за хорошее разнообразие ответов и форматирования. Но я хотел немного прояснить, почему вы указали -D -Rстартовые флаги screen. Я прочитал справочную страницу, и это не помогло мне понять: -D -R Attach here and now. ...
hello_there_andy

@hello_there_andy В руководстве четко указано, что делает -DR. По сути, если у вас уже запущен сеанс Screen, он будет подключен к нему вместо создания нового сеанса (даже если пользователь вошел в него через SSH - он исключит их, что полезно, если пользователь зависает из-за к плохому сетевому соединению.)
Дэмиен Ó Киллай

1
Обратите внимание, что указывать имя сеанса необязательно.
Дэмиен Ó Силай

Хорошо, я думаю, что понимаю, но я думаю, я подумал (может быть, неправильно), что это screen -r <session>сделал ... так что -DRотличается от того, -rчто он может выгнать их? Не просто присоединить и потерпеть неудачу, если на нем есть другой пользователь.
hello_there_andy

Я сделал некоторое тестирование, чтобы быть уверенным. -D делает то же, что и -d, за исключением того, что он также закрывает соединение SSH (выход пользователя из системы) в дополнение к просто отключению любых существующих сеансов экрана. -r присоединяет сессию -R повторно присоединяет существующий сеанс, но создаст новый сеанс, если он не существует (-r потерпит неудачу, если не будет сеанса для повторного присоединения.) Итак, я был немного неточным в моем предыдущем описании.
Дэмиен Ó Силай

10

Вы можете использовать nohup(1), то есть сделать что-то вроде:

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

Это создаст вывод nohup.out. Тогда вы можете безопасно выйти из системы.


В &конце концов, это изменило меня! Благодарность!
winklerrr

6

Да, это будет прекращено. Решением для поддержания терминальной сессии без подключения является screenпрограмма:

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

Как сказано выше, вы можете использовать экранную команду, например:

  • Создать экран

user@server:~$ screen -S bigscptransfer

  • Вы сейчас на экране

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

  • Отсоедините от экрана, используя CTRL+, Aзатем нажмитеD

[detached from 5899.bigscptransfer]

  • Возобновите сеанс, когда вам это нужно:

user@server:~$ screen -r bigscptransfer


-1

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

временно остановить команду с

CTRL + Z

поставьте в фоновом режиме команду, наберите:

Б.Г.

Вы можете проверить процесс с помощью:

работы

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.