Передается ли `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. Тогда вы можете безопасно выйти из системы.

vonbrand
источник
В &конце концов, это изменило меня! Благодарность!
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

victorcete
источник
-1

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

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

CTRL + Z

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

Б.Г.

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

работы

SHINTO ROOSE PRELATE
источник