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

644

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

Оливье Лалонд
источник
2
Связанный: unix.stackexchange.com/questions/4004/…
Антон Тарасенко

Ответы:

750

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

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

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

Основная функциональность

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

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

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

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

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

Tongpu
источник
4
@CraigM Используйте screen -x -r [screenname]или screen -rxдля краткости, если у вас активен только один сеанс экрана. Это позволяет вам прикрепить существующий экземпляр экрана.
Лекенштейн
5
Этот совет помог мне с той же проблемой, но я думаю, что он включает опечатку. Я вполне уверен, что вам нужно набрать, Ctrl-bа затем d, чтобы выйти / отключить tmuxсеанс. Конечно, это относится к версии tmuxна моем Ubuntu 12.04.
cxrodgers
17
Я сделал ошибку, следуя приведенным выше инструкциям. Я поделюсь этим, если кто-то может упасть в ту же ошибку: я запустил tmux в оболочке моего собственного компьютера вместо оболочки удаленного компьютера. Нужно запустить tmux в оболочке удаленного компьютера.
Мерт Нухоглу
5
Экран теперь снова разрабатывается: lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html Не могли бы вы обновить свой ответ?
Муру
4
В качестве альтернативы, запустите tmux detachвместо того, чтобы печататьctrl-b d
Андрей
306

Опция 1: nohup

Лучший способ часто самый простой.

nohup long-running-command &

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

man nohup

Вариант 2: bg

Если вы хотите «справиться» с некоторыми уже запущенными задачами, то лучше всего Ctrl+ Zзатем запустить

bg

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

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

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

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

coteyr
источник
4
Я бы порекомендовал сделатьdisown -h
Мишель
интересно, экран и tmux не работают для
майнера
1
bg+ disownне работает для меня. У меня был запущен скрипт развертывания, я забыл запустить его внутри tmux, и мне нужно было рано уйти на встречу. Скрипт непрерывно выводит прогресс в оболочку. ctrl+zостановил процесс, вернув меня в bash. bgвозобновил процесс, но он также возобновил вывод статуса в bash, делая невозможным просмотр того, что я печатал. Тем не менее, disownкоманда выдала «disown: current: no
not
это не сработало для меня julia myFile.jlпо любой причине. Tmux делает и отлично.
kilgoretrout
Это сработало для меня, большое спасибо
Чад
207

Вы можете сделать это с помощью screen.

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

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

  • SSH в ваш удаленный ящик. Тип screenЗатем запустите нужный процесс.

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

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

Линкольн
источник
32
Обычно я называю свои сеансы экрана, screen -S nameчтобы потом было проще подключиться к нужному.
Дэвид Онеилл
Ссылка не работает
Габ 是 好人
1
Лично я работаю над коробкой без какой-либо программы контроля пакетов. Потратив примерно полчаса на создание зависимостей для TMUX (с которыми у меня лично есть опыт работы с ним и которые мне нравятся) из источника, стало ясно, что экран для меня - лучшее и более простое решение. TL; DR: оптимальное решение этой проблемы зависит от варианта использования, машины и того, сколько времени вам потребуется на настройку. Спасибо за этот ответ :)
Макс фон Хиппель
Сочетание с screen -Sперед отъездом и screen -rпри возвращении удивительно!
Меломан
Спасибо за это. Это решение работало для меня, а tmux - нет (я использую версию bash для Windows, когда ssh'ing в Linux-машину)
Майкл Соренсен,
83

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

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

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

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

bassgey
источник
10
Это также мой любимый способ сделать это. Я часто используюdisown -a && exit
Стефано Палаццо
1
Отлично. Это прекрасная команда и заслуживает всех голосов!
Грег
8
Одним словом предостережения, я остановил запущенный процесс с помощью Ctrl-Z и не запустил его в фоновом режиме перед вызовом, disownи это убило его.
HDave
3
Может произойти сбой, если он хочет написать в терминал. Перенаправление вывода запущенного процесса не так просто. Лучше начать все правильно с nohup.
jiggunjer
2
Это хороший ответ, потому что он прямо отвечает на вопрос. Автор вопроса спросил, что делать после того, как он уже выполнил кучу длительных команд. Большинство из этих ответов позволяют вам знать, что делать, прежде чем выполнять команды.
q0rban
53

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

  1. SSH [сервер]
  2. команда
  3. Ctrl+Z
  4. Б.Г.
  5. disown [необязательный pid процесса, по умолчанию последний)
  6. Выход

Шаг 3 приостанавливает текущий процесс (например, моя команда 'mv').
Шаг 4 переводит приостановленный процесс в фоновый режим и возобновляет его.
Шаг 5 позволяет вам отказаться от процесса. ** Чтобы получить список рабочих мест, просто введите jobsранее.


** Относительно отказа (из руководства по bash):

disown [-ar] [-h] [jobspec ... | pid ... ]
              Without  options,  remove  each jobspec from the table of active
              jobs.  If jobspec is not present, and neither the -a nor the  -r
              option  is  supplied, the current job is used.  If the -h option
              is given, each jobspec is not removed from  the  table,  but  is
              marked  so  that  SIGHUP  is  not  sent  to the job if the shell
              receives a SIGHUP.  If no jobspec is  supplied,  the  -a  option
              means  to  remove or mark all jobs; the -r option without a job‐
              spec argument restricts operation to running jobs.   The  return
              value is 0 unless a jobspec does not specify a valid job.
Хаос
источник
2
Встроенные всегда мой первый выбор :) THX
ken_oy
Этот ответ должен быть помечен как правильный. Для установки и привыкания экрана для решения этой проблемы преувеличено.
Ульрих-Лоренц Шлютер
Это очень полезно, когда вы уже запустили какую-либо команду и которая выполняется долго. Завершение и запуск его в сеансе TMUX займет время
Дипали Миттал
1
@ Том-Броссман: Пожалуйста, следите за ненужными правками, как этот ! Если вызывается без указания задания, disownвстроенная команда действует для самого последнего фонового задания.
Дэвид Фёрстер
22

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

бёбу

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

sudo aptitude install byobu

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

su -c 'yum install byobu'

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

Используя byobu

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

изображения бёбу

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

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

Начните byobu, набрав byobu.

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

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

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

    бёб-открепление прикрепить

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

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

SiddharthaRT
источник
Я попытался использовать byobu из сеанса на основе PuTTY в своем Ubuntu-окне, но строка состояния повторяется и прокручивается на дисплее. Хотя он отсоединялся должным образом при нажатии клавиши F6, это не было полезным решением в моей настройке.
jfmessier
1
@jfmessier Это потому, что PuTTY не очень хорошо берет ncurses (utf-8). Эту проблему можно устранить, следуя этой теме - stackoverflow.com/questions/10731099/…
SiddharthaRT
Это круто! 1. он дает мне цветное приглашение bash, которое я не могу включить с помощью bash в качестве оболочки по умолчанию и 2. я могу запустить 2 бота одновременно, и у меня все еще есть другой терминал для работы! @SiddharthaRT Вы заслуживаете возражения, сэр!
Дев
18

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

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

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

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

Byobu помещает простой интерфейс в верхнюю часть экрана с меню и т. д. Это также текущая реализация экрана в более новой версии Ubuntu. F2 для запуска новой клеммы F3 / F4 для переключения вперед и назад и F6 для отключения. Введите exit, чтобы окончательно завершить терминалы.

Ричард Холлоуэй
источник
Byobu использует tmux в эти дни ..
scottl
12
«Вы не можете сделать это после запуска процесса, вам нужно настроить все, прежде чем запускать долго выполняемое задание». - нет, вы можете использовать disownдля этого. Смотрите ответ @ bassgey
Rich
1
после того, как изо всех сил пытался изучить экран и tmux .... byobu вызвал слезы на моих глазах
HDave
disownа при необходимости просто Ctrl-z, bgчтобы получить его из активного терминала и в фоновом режиме. Тогда disown.
Mimoralea
8

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

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

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

Наконец, вызовите команду disown (с последующим идентификатором jobid ... как с командой bg)

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

Хорхе Гутьеррес
источник
2
Этот ответ самый лучший! Почему все говорят о том screen, что после входа в систему был задан вопрос, как сохранить процессы запущенными, теперь после входа в систему, но до их запуска. Отличный ответ Хорхе, вы действительно помогли мне! :)
jwbensley
1
Просто bg(без %1) достаточно часто, так как по умолчанию текущая работа
Уолтер Тросс
Было бы неплохо получить исчерпывающий ответ: A priori (настройка заранее): экран терминала ascii (старый), tmux (новый); X windows: vnc (старый, все еще поддерживается), xpra (более новый), с xpra, не имеющим прав root. Апостериорный (настойчиво после того, как вы начали): ^ Z, отрекайтесь, ... Но я слишком ленив, чтобы конкретизировать это больше, чем это.
Крейзи Глеу
8

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

Пример:

/path/to/my/script &

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


источник
3
Да, я хотел бы знать, насколько screen / tmux лучше этого простого решения.
Мадс Скьерн
Да, я могу видеть это и на моей Ubuntu, но это не должно происходить в теории. Я не понимаю, почему
Даниэль Пиньоль
1
@MadsSkjern Потому что вы не можете вводить какие-либо входные данные в сценарий, используя этот метод.
Кен Шарп
1
@MadsSkjern, причина в том, что если вы запустите такие процессы с помощью, &если вы выйдете из системы и войдете в сеанс SSH, процесс все равно будет работать, однако вы не сможете увидеть выходные данные этого процесса (если ваш сценарий повторяет что-то, что вы не увидит, но если он напишет файл, файл будет там)
DarkCygnus
4

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

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

  • Используйте команду screenдля первого запуска, пролистайте вводные сообщения, вам должен быть вручен терминал.
  • Ca Cc открывает еще один терминал
  • Ca Ck убивает терминал
  • Вы можете использовать Ca C-Space и Ca C-Backspace для переключения между терминалами
  • Ca Ca удобен, если вы используете в основном только два терминала
  • Ca Cd отключает текущий сеанс экрана и выходит из экранов. Затем вы можете использовать, screen -rчтобы возобновить этот сеанс. Вы можете иметь несколько отдельных сеансов экрана одновременно, в этом случае вам будет показан список доступных сеансов.

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

Т. Веррон
источник
3

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

Ctrl + Z приостановит запущенную программу

«BG» будет запускать его в фоновом режиме

Руп
источник
5
Без отказа от процесса (с чем-то вроде disownили nohup) это обычно не будет запускать процесс после окончания сеанса SSH.
Элия ​​Каган
3
На моем сервере Ubuntu с настройками по умолчанию он действительно продолжает работать!
Мадс Скьерн
3

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

disown -a
Zibri
источник
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 по умолчанию? Может быть, некоторые системные администраторы изменяют настройки по умолчанию для больших оболочек, чтобы процессы своих пользователей не перегружали систему?

Дэн Галлаге
источник
Если у вас есть еще вопросы, пожалуйста, задайте их как новый вопрос
Heemayl
0

К сожалению, завершенный сеанс SSH может привести к удалению tmux или экрана. Это потому, systemdчто прекратит любые дочерние процессы при выходе из сеанса.

Вы можете изменить эту настройку в вашем logind.conf( /etc/systemd/logind.conf):

KillUserProcesses=no

Спасибо за ответ в https://unix.stackexchange.com/questions/490267 .

Джонатан
источник
-1

Вместо :

cmd options; 

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

nohup cmd options & 

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

tail -f nohup.out
Абденнур ТУМИ
источник