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

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

14 ответов

Решение

Вы должны искать современные альтернативы, такие как 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 или страницу tmux GitHub. В частности, вот часто задаваемые вопросы об основных различиях между screen а также tmux,

Опция 1: nohup

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

nohup long-running-command &

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

man nohup

Вариант 2: bg

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

bg

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Я застрял в большом 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.

Есть две основные программы, которые вы можете использовать для поддержки программ и состояния терминала через несколько соединений 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. Используй это! Некоторые окончательные руководства здесь или здесь.

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

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

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

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

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

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

Пример:

/path/to/my/script &

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

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

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

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

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

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

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

disown -a

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

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

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

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

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

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

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

Вместо:

cmd options; 

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

nohup cmd options & 

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

tail -f nohup.out

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

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

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

KillUserProcesses=no

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

Другие вопросы по тегам