Продолжайте сеансы SSH работать после отключения

208

Иногда у меня есть долго запущенные процессы, которые я хочу запустить перед тем, как идти домой, поэтому я создаю SSH-сеанс на сервере, чтобы запустить процесс, но затем я хочу закрыть свой ноутбук и пойти домой, а позже, после ужина, я хочу проверьте процесс, который я начал перед уходом с работы. Как я могу сделать это с SSH? Насколько я понимаю, если вы разорвете SSH-соединение, вы также прервете сеанс входа в систему на сервере, что приведет к остановке длительного процесса.

Йонас Гораускас
источник

Ответы:

205

Используйте, nohupчтобы ваш процесс игнорировал сигнал зависания:

$ nohup long-running-process &
$ exit
Уоррен Янг
источник
20
Это оно. Не нужно устанавливать экран или tmux. Это на самом деле старый добрый способ сделать это. Конечно, «screen» или «tmux» являются чудесными приложениями и должны использоваться при необходимости, но так же просто, как запуск процесса в фоновом режиме, из которого вы можете выйти, перейдите к описанному выше.
Райх
2
nohup как отречься?
cjac
28
У них схожие цели, но они отличаются во многих отношениях. nohupперехватывает SIGHUP, так что когда запущенная оболочка завершает работу и отправляет SIGHUP всем своим все еще работающим дочерним элементам, long-running-processне умирает. disownпросто удаляет указанное задание из дочернего списка Bash, чтобы он вообще не пытался отправить SIGHUP. nohupэто программа, отдельная от оболочки, поэтому она работает со всеми оболочками, тогда disownкак встроена в Bash. nohupпринимает команду для запуска, тогда как disownработает только после того, как задание запущено, и вы сделали его фоновым, чтобы вы могли вернуться в оболочку.
Уоррен Янг
3
Потрясающий краткий обзор для тех, кто не знаком с nohup и отрекается от него - а также некоторые простые способы работы с терминальными сессиями serverwatch.com/tutorials/article.php/3935306/…
Дан
7
tail -f nohup.outчтобы проверить, что происходит, когда ты вернешься.
Рикардо Стювен
141

Вы хотите использовать GNU Screen. Это супер круто!

ssh me@myserver.com
screen               #start a screen session
run-a-long-process

CTRL+ a, dчтобы оторваться от вашего экрана сессии

exit                 #disconnect from the server, while run-a-long-process continues

Когда вы вернетесь к своему ноутбуку:

ssh me@myserver.com
screen -r            #resume the screen session

Тогда проверьте прогресс вашего длительного процесса!

screenэто очень всеобъемлющий инструмент, и может сделать гораздо больше, чем я описал. Во время сеанса экрана попробуйте ctrl + a,? выучить несколько общих команд. Вероятно, наиболее распространенными являются:

  • CTRL+ a, cчтобы создать новое окно
  • CTRL+ a, nчтобы перейти к следующему окну вашего сеанса экрана
  • CTRL+ a, pчтобы переключиться на предыдущее окно вашего сеанса экрана
  • если вы входите в систему из разных систем, вы можете случайно остаться подключенными к активному сеансу экрана на другом компьютере. по этой причине я всегда продолжаю с того, screen -d -rчтобы убедиться, что если к моему экранному сеансу подключена другая оболочка, она будет отключена, прежде чем я возобновлю ее в моей текущей системе.
Сэнди
источник
8
tmux - современный аналог экрана.
zvolkov
Я не знаю о современных, но префикс по умолчанию для tmux (Ctrl + b) помогает, если вы привыкли к клавишам bash / emacs.
Саджит
2
Экран довольно крутой, если вам нужен общий терминал по какой-то причине. Создайте экран screen -S nameи позвольте другому другу подключиться к нему screen -x name.
Патрик
1
tmuxwith tmuxinator- отличное сочетание для модных установок, а я предпочитаю screenбыстрое и простое решение.
earthmeLon
Этот ответ самый лучший .. Мне нравится. Отличное исследование
Джаффер Уилсон
42

Если вы не запланировали заранее, не настроили screenи т. Д., Просто сделайте следующее:

  1. Если ваш процесс работает в фоновом режиме: перейдите к # 3, иначе: Ctrl-Zприостановить процесс переднего плана. Это сообщит о задании № приостановленного процесса, например:

    [1]+  Stopped                 processName
    
  2. Отправить processNameв фон с bg %1(используя все, что задание # следует за %). Это возобновится processNameв фоновом режиме.

  3. Отказаться processName от disown %1или disown PID. Используйте -hфлаг, если вы хотите сохранить право собственности, пока не прекратите свою текущую оболочку.

Майк Ковингтон
источник
5
Спасибо за это! У меня была работа, и я думал, что не смогу ее продолжать, потому что не использовал, &когда начал. Кажется, это отлично работает!
Мэтт
4
Это потрясающе! Я никогда не знал, что Linux может позволить вам передавать контроль над такими активными процессами. Я боялся, что моя батарея разрядится, когда SSH будет работать на моем сервере в середине длительного процесса, и это был ответ для меня!
Плутон
14

То, что вы хотите использовать, это экран или, что еще лучше, удобная оболочка вокруг экрана, которая называется byobu.

Экран позволяет запускать несколько сеансов виртуального терминала в одном сеансе SSH. А учебник и справочные страницы доступны.

byobu - это обертка, которая позволяет легко открывать новые экраны с помощью простой функциональной клавиши вместо комбинации клавиш ctrl-a. Он также показывает строку состояния со всеми открытыми виртуальными терминалами, которые могут быть названы.

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

Напоследок несколько скриншотов по бёбу.

txwikinger
источник
Я запустил процесс на своем сервере в терминале Byobu, не зная, что это такое (я просто искал в терминале и нажал на Byobu, потому что никогда раньше не видел). Я продолжал использовать Byobu, потому что у него была красочная строка состояния внизу, и я подумал, что это круто. Сегодня я обнаружил, что хочу получить доступ к этой терминальной сессии через SSH. Все, что мне нужно было сделать, это набрать «byobu», и это сразу показывало сеанс терминала. Очень рад, что наткнулся на бёбу!
Ник
8

Стоит отметить, что

ssh -t lala screen -rxU mooприкреплю к сеансу мула на принимающей лале

ssh -t lala screen -S mooсоздаст сеанс moo на хосте lala

а также

ssh -t lala screen -S moo quuxсоздаст сеанс moo на хосте lala и запустит программу quux , завершив сеанс по завершении.

cjac
источник
3

Старый вопрос, странно, еще никто не советовал tmux , который действует как обертка для n консолей и держит их открытыми до тех пор, пока не понадобится. Это дает больше контроля, помимо ряда функций, которые имеет tmux. Управлять им легко, вы просто запускаете tmux, который переносит вас в его оболочку, запускают задание looong, затем нажимаете ctrl + b, затем d (detach) ( ctrl+bэто «ок google» в tmux и dкоманда закрытия). без выхода из оболочки). Это на самом деле работает, если вы просто закроете, например, шпаклевку. После ужина, когда вы снова подключитесь, вы можете снова открыть tmux, tmux attachчтобы видеть ваш экран точно так же, как вы ушли. Что-то, что я люблю, это разделение панели, ctrl+bа затем нажмите ". Чтобы перейти с одной панели на другую, ctrl+bа затем нажмите стрелку вверх / вниз.

nnsense
источник
3

Вы можете найти хорошее руководство здесь: продолжайте сеанс SSH, когда вы отключаетесь

sudo apt-get install screen

Теперь вы можете начать новый сеанс экрана, просто набрав screen в командной строке. Вам будет показана некоторая информация об экране. Нажмите Enter, и вы будете в обычном режиме.

Чтобы отключить (но оставить сеанс запущенным), нажмите « Ctrl+», Aа затем « CtrlDсразу. Вы увидите сообщение [отделено]

Чтобы подключиться к уже запущенному сеансу

screen -r

Чтобы повторно подключиться к существующему сеансу или создать новый, если ни один не существует

screen -D -r

Чтобы создать новое окно внутри сеанса работающего экрана, нажмите « Ctrl+», Aа затем Cсразу. Вы увидите новый запрос.

Чтобы переключиться с одного окна экрана на другое, нажмите « Ctrl+», Aа затем « CtrlAподряд.

Для просмотра списка открытых окон нажмите « Ctrl+», Aа затем Wсразу

Виктор Хьюго Аранго А.
источник
Вы можете использовать <kbd>Ctrl</kbd>для отображения имен в качестве клавиш клавиатуры.
Томаш
1

Я использую NX NoMachine, который бесплатен для меня, потому что это только я. По сути, он запускает сеанс X на сервере, к которому вы можете подключаться и отключаться снова и снова. X сессия продолжается, когда вы не подключены. Соединения могут быть сделаны из любого места. Вы можете выбирать между плавающими окнами или одним окном, содержащим весь рабочий стол (например, полный рабочий стол Gnome). Клиент (который вы запускаете на своем ноутбуке) может быть запущен в Linux, MacOS, Solaris или Microsoft Windows. В последнем случае, если вы выбираете плавающие окна, они отображаются отдельно на панели задач Windows.

Я использую свой ноутбук с Windows XP (который мне нужен для определенного оборудования, специфичного для Windows) в качестве внешнего интерфейса для двух моих серверов Linux, использующих NX Nomachine. Я даже могу печатать на принтере, подключенном к моему ноутбуку с Windows из Linux.

Rob_before_edits
источник