Как сохранить процессы после завершения сеанса ssh?

Предположим, что я запускаю кучу процессов из сеанса ssh. Можно ли завершить сеанс ssh, сохранив эти процессы на удаленном компьютере?

ssh
487 голосов | спросил Olivier Lalonde 21 +04002010-10-21T16:09:13+04:00312010bEurope/MoscowThu, 21 Oct 2010 16:09:13 +0400 2010, 16:09:13

14 ответов


574

Вы должны искать современные альтернативы, такие как tmux.

tmux превосходит экран screen по многим причинам, вот несколько примеров:

  • Windows может быть перемещена между сеансами и даже связана с несколькими сеансами.
  • Окна можно разделить горизонтально и вертикально на панели
  • Поддержка цветных терминалов UTF-8 и 256
  • Сессии можно управлять из командной оболочки без необходимости вводить сеанс

Основные функции

Чтобы получить те же функции, что описаны в ответах , рекомендующих экран screen, вам понадобится для выполнения следующих действий:

  • ssh на удаленную машину
  • запустите tmux, введя tmux в оболочку
  • запустите процесс, который вы хотите, в начальный сеанс tmux
  • оставьте /отсоедините сеанс tmux, набрав Ctrl + b , а затем d

Теперь вы можете безопасно выйти из удаленного компьютера, ваш процесс будет работать внутри tmux. Когда вы вернетесь назад и хотите проверить статус своего процесса, вы можете использовать tmux attach для присоединения к сеансу tmux.

Если вы хотите, чтобы несколько сеансов работали бок о бок, вы должны называть каждый сеанс, используя Ctrl + b и $. Вы можете получить список текущих сеансов, используя tmux list-sessions.

tmux может выполнять гораздо более сложные действия, чем обрабатывать одно окно за один сеанс. Для получения дополнительной информации см. man tmux или страницу tmux GitHub . В частности, здесь часто задаваемые вопросы об основных отличиях между screen и tmux.

ответил tongpu 23 52012vEurope/Moscow11bEurope/MoscowFri, 23 Nov 2012 13:26:10 +0400 2012, 13:26:10
209

Самый лучший способ - это самый простой способ.

nohup long-running-command &

Это было сделано специально для этого, он даже записывает stdout в nohup.log

man nohup

Если вы хотите «зафрахтовать» некоторые уже запущенные задачи, тогда ваш лучший выбор - ctrl + z, затем запустите

bg (это закроет вашу последнюю приостановленную задачу, позволяя ей продолжать работать)

, то быстрый disown должен поддерживать процесс после выхода из системы.

screen, а другие могут это сделать, но это не то, для чего они предназначены. Я рекомендую nohup для задач, которые, как вы знаете, собираетесь оставить, и bg для задач, которые уже запущены и не хотят перезапускать.

Имейте в виду, что оба имеют значение bash. Если вы не используете bash, команды могут быть разными.

ответил coteyr 28 32012vEurope/Moscow11bEurope/MoscowWed, 28 Nov 2012 06:58:12 +0400 2012, 06:58:12
178

Вы можете сделать это, используя экран screen.

Введите man screen, чтобы узнать больше или прочитать это экранная страница .

Простой сценарий:

  • ssh в удаленном поле. Введите screen Затем запустите процесс, который вы хотите.

  • Нажмите Ctrl - A , затем Ctrl - D . Это будет «отсоединять» сеанс экрана, но оставит ваши процессы запущенными. Теперь вы можете выйти из удаленного окна.

  • Если вы хотите вернуться позже, снова войдите в систему и введите screen -r. Это приведет к «возобновлению» сеанса экрана, и вы сможете увидеть результаты своего процесса.

ответил Lincoln 21 +04002010-10-21T16:20:01+04:00312010bEurope/MoscowThu, 21 Oct 2010 16:20:01 +0400 2010, 16:20:01
72

Экран и nohup - лучший способ, но если вам нужно отключить процесс, уже запущенный без экрана или nohup, вы можете запустить команду disout.

  

disown [-ar] [-h] [ jobspec … | pid pid

     

Без параметров удалите каждый jobspec из таблицы активных заданий. Если задана опция … ], задание не удаляется из таблицы, но помечено так, что SIGHUP не отправляется заданию, если оболочка получает SIGHUP. Если jobspec отсутствует, и не предоставляется опция -h или -a, используется текущее задание. Если не задано jobspec , параметр -r означает удаление или отметку всех заданий; параметр -a без аргумента jobspec ограничивает выполнение рабочих заданий.

С отключением вы можете закрыть терминал и запустить процесс на машине.

ответил bassgey 21 +04002010-10-21T17:19:23+04:00312010bEurope/MoscowThu, 21 Oct 2010 17:19:23 +0400 2010, 17:19:23
35

Я застрял в большом mv, поэтому я не смог остановить процесс, настроить экран и снова запустить его. Мне удалось выйти из сеанса ssh с запущенным процессом, выполнив следующие шаги:

  1. ssh [сервер]
  2. Команда
  3. CTRL + Z
  4. BG
  5. открестился
  6. Выход литий>

Шаг 3 приостанавливает текущий процесс (например, моя команда «mv»). Шаг 4 ставит приостановленный процесс на задний план и возобновляет его. Шаг 5 позволяет отказаться от процесса.

ответил Chaos 25 12013vEurope/Moscow11bEurope/MoscowMon, 25 Nov 2013 07:30:49 +0400 2013, 07:30:49
19

Существуют две основные программы, которые вы можете использовать для поддержки программ и состояния терминала по нескольким соединениям ssh. Это экран (действующий, но, к сожалению, не имеющий силы. По-видимому активно развивается сейчас ) и tmux (новее, активно поддерживается). Byobu - это интерфейс, который может работать поверх их этих систем и предоставлять дополнительную информацию о состоянии Ubuntu. В новых установках он будет использовать tmux в качестве бэкэнд, если у вас установлена ​​более старая установка byobu и существующая конфигурация, она будет поддерживать предыдущий бэкэнд, будь то экран или tmux.

бёбу

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

sudo aptitude install byobu

Используя yum, вы делаете

su -c 'yum install byobu'

Также можно установить byobu в других дистрибутивах.

Использование byobu

Вы можете запустить byobu, запустив byobu на хост-машине после подключения с помощью ssh. Это даст вам оболочку, которая выглядит так:

image-byobu

Вы также можете использовать терминал Byobu на машине Ubuntu с опцией -X и легко иметь идеальную работу byobu.

Использование:

Запустите byobu, набрав byobu.

Вы можете нажать F2, чтобы создать новое окно в текущем сеансе, F3-F4, чтобы переключаться между различными окнами.

Лучшая часть byobobu - вам не нужно фактически убивать процессы, запущенные в терминале, чтобы покинуть терминал. Вы можете просто отправить экран /tmux (скелет byobu) на задний план и возобновить следующий приход:

  • Чтобы оставить byobu и keeep, он работает (отсоединяется), нажимайте F6.
  • В следующий раз, когда вы придете, просто сделайте byobu, и вы вернетесь туда, где вы были.

    byobu-detach-attach

Вы также можете создавать различные сеансы byobu по byobu -S session1 и так далее. И вы можете подключиться к любому из них, когда вернетесь.

Вы можете сделать гораздо больше, используя Byobu. Используй это! Некоторые окончательные руководства здесь , здесь или здесь .

ответил SiddharthaRT 25 72012vEurope/Moscow11bEurope/MoscowSun, 25 Nov 2012 02:09:39 +0400 2012, 02:09:39
16

Вы не можете сделать это, как только процесс начнется, вам нужно настроить все, прежде чем запускать долгое задание.

Вы можете использовать nohup , но современная мудрость подсказывает, что вы используете экран или byobu как ваш логин, чтобы вы могли отсоединять и оставлять вещи Бег.

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

Существует разумное начало работы руководство по экрану здесь.

byobu предоставляет простой в использовании интерфейс поверх экрана с меню и т. д. Это также текущая реализация экрана на более новой ubuntu. F2 для запуска нового терминала F3 /F4 для переключения взад и вперед и F6 для разъединения. Типовой вывод на конечные терминалы навсегда.

ответил Richard Holloway 21 +04002010-10-21T16:16:58+04:00312010bEurope/MoscowThu, 21 Oct 2010 16:16:58 +0400 2010, 16:16:58
7

Эй, пока я согласился, что экран - самый эффективный вариант. Вы можете использовать vncserver, а затем запустить процесс на нем.

Также, если ваши единственные проблемы состоят в том, чтобы запустить процесс и не нужно брать его обратно, и, самое главное, вы не знали, что вам нужно будет закрыть сеанс, и у вас уже запущен процесс, вы не удачи, если вы использовали bash в качестве оболочки

Сначала вам нужно отправить процесс на задний план, набрав Ctrl + Z, а затем bg% 1 (число зависит от номера задания, обычно это 1, но вы можете легко вывести список с помощью заданий команды)

Наконец, вызывается команда disown (за которой следует jobid ... то же, что и с командой bg)

Это приведет к отключению отношения родитель-потомок между вашей оболочкой и процессом в фоновом режиме, что предотвратит ее смерть, когда ваша оболочка будет завершена.

ответил Jorge Gutierrez 7 J0000006Europe/Moscow 2011, 01:29:04
7

Для одного сценария оболочки, который у меня работает в течение длительного периода времени, я войду в систему и запустил процесс в фоновом режиме с помощью «&».

Пример:

/path/to/my/script &

Я вышел из системы и отключил сеанс SSH. Когда я вхожу в систему через некоторое время, сценарий все еще выполняется, как доказано непрерывным сбором данных из сценария.

ответил 29 J000000Tuesday14 2014, 18:58:11
3

Вы должны проверить экран GNU и посмотреть, поможет ли он вам. В зависимости от того, как вам нужно приложение для запуска в реальном времени, оно может вызвать больше проблем, чем оно решает, но по крайней мере это позволит вам возобновить сеанс, как будто вы его никогда не покидали.

Как использовать:

  • Используйте команду screen для первого запуска, прокрутите вводные сообщения, вам нужно передать терминал.
  • C-a C-c открывает еще один терминал
  • C-a C-k убивает терминал
  • Вы можете использовать C-C-пространство и C-C-Backspace для циклического перехода через терминалы
  • C-a C-a удобен, если вы в основном используете только два терминала
  • C-a C-d отсоединяет текущий сеанс экрана и выходит из экранов. Затем вы можете использовать экран screen -r, чтобы возобновить этот сеанс. У вас может быть несколько отдельных сеансов экрана одновременно, в этом случае вам будет показан список доступных сеансов.

Есть много других опций, например разделенные экраны, а также все ярлыки полностью настраиваются.

ответил T. Verron 22 Maypm12 2012, 19:31:06
2

Самый простой ответ ...

ctrl + z приостанавливает запущенную программу

"bg" запустит его в фоновом режиме

ответил Roop 13 AM00000040000000031 2013, 04:28:00
2

Самый простой способ - запустить команду в фоновом режиме с помощью &. Затем просто напишите:

disown -a
ответил Zibri 11 Jam1000000amWed, 11 Jan 2017 06:52:30 +030017 2017, 06:52:30
0

В то время как все говорят использовать disown (единственный вариант, который у вас есть после того, как вы уже начали процесс), nohup или даже запустить команду в screen, что полезно, если вы хотите увидеть весь вывод из этой команды ... Я фанат экрана screen. Я все еще пробовал самые последние основные дистрибутивы Linux и просто поставил работа в фоновом режиме и прекращение работы не приводит к тому, что все процессы, которые работают, умирают. Должна быть глобальная установка или что-то еще. Я пытаюсь это на некоторых довольно старых системах (slackware 12), и мой тестовый скрипт работает до тех пор, пока я его не убью вручную:

shell$ cat > test.pl

#!/usr/bin/perl
while(1){
     sleep(1);
}
    shell$ perl ./test.pl &
    shell$ exit
    logout
    shell$ ps aux test.pl
    mymom 31337     1  0 13:25 ?        00:00:00 perl ./test.pl
    shell$ 

Хотя я согласен с тем, что screen будет лучшим способом запускать это, даже если мой скрипт написал файлы журналов или что-то еще. Мне никогда не нужно было использовать disown -a или nohup, если только он не вышел из полной паранойи. Может быть, кто-то может пролить свет на то, как bash ведет себя по умолчанию? Может быть, некоторые системные администраторы меняют значения по умолчанию на больших оболочках, чтобы процессы своих пользователей перегружали систему?

ответил Dan Gullage 29 J000000Wednesday15 2015, 20:42:07
-1

Вместо:

cmd options; 

Добавить перед nohup:

nohup cmd options & 

Затем вы сможете увидеть консоль stdout:

tail -f nohup.out
ответил Abdennour TOUMI 22 +03002016-10-22T13:51:56+03:00312016bEurope/MoscowSat, 22 Oct 2016 13:51:56 +0300 2016, 13:51:56

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132