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

438

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

    
задан Olivier Lalonde 21.10.2010 в 14:09
источник

14 ответов

517

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

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

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

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

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

  • ssh на удаленную машину
  • start 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.11.2012 в 10:26
источник
169

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

nohup long-running-command &

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

man nohup

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

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

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

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

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

    
ответ дан coteyr 28.11.2012 в 03:58
160

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

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

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

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

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

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

ответ дан Lincoln 21.10.2010 в 14:20
64

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

  

disown [-ar] [-h] [ <я> jobspec … | <я> pid … ]      

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

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

    
ответ дан bassgey 21.10.2010 в 15:19
18

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

бёбу

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

sudo aptitude install byobu

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

su -c 'yum install byobu'

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

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

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

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

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

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

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

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

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

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

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

ответ дан SiddharthaRT 24.11.2012 в 23:09
16

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

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

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

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

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

    
ответ дан Richard Holloway 21.10.2010 в 14:16
16

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

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

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

    
ответ дан Chaos 25.11.2013 в 04:30
7

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

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

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

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

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

    
ответ дан Jorge Gutierrez 06.06.2011 в 23:29
6

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

Пример:

/path/to/my/script &

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

ответ дан user108430 29.07.2014 в 16:58
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.05.2012 в 17:31
2

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

disown -a
    
ответ дан Zibri 11.01.2017 в 04:52
1

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

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

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

    
ответ дан Roop 13.08.2013 в 02:28
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.07.2015 в 19:42
-1

Вместо:

cmd options; 

Добавить до nohup :

nohup cmd options & 

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

tail -f nohup.out
    
ответ дан Abdennour TOUMI 22.10.2016 в 12:51