Чи закривається передача `scp`, коли я закриваю оболонку?


29

У мене є scpпередача (з одного віддаленого сервера на інший), що є досить великим.

Тож, можливо, я хочу закрити комп'ютер, з якого я виконав цю команду, чи завершиться передача? У мене є sshдоступ до оболонки за допомогою програми Bitwise.

Відповіді:


34

Є ряд рішень.

Передумови та відключення процесу

  1. Відкрийте ssh-термінал на віддаленому сервері.
  2. Почніть scpпередачу, як завжди.
  3. Фоновий процес scp ( Ctrl+ Z, потім команда bg.)
  4. Відкрийте фоновий процес ( disown).
  5. Припиніть сеанс ( exit), і процес продовжить працювати на віддаленій машині.

Одним з недоліків цього підходу є те, що дескриптори файлів для stdout та stderr все ще будуть містити посилання на tty сесії вашого ssh. Термін може зависнути при спробі виходу через це. Ви можете обійти це, ввівши, ~.щоб змусити закрити ваш ssh-клієнт (ця послідовність евакуації повинна слідувати новому рядку ... див. Також ~?). Якщо процес, який ви відмовляєтеся, пише в 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 робить чітко. В основному, якщо у вас вже запущений сеанс на екрані, він повторно приєднається до нього, а не створює новий сеанс (навіть якщо користувач увійшов до нього через SSH - він випустить їх, що корисно, якщо користувач зависне через до поганого підключення до мережі.)
Дамієн Ó Ceallaigh

1
Зауважте, що вказувати назву сеансу необов’язково.
Дамієн Ó Ceallaigh

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

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

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

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

bg

Ви можете перевірити процес за допомогою:

робочі місця

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.