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

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

Вам следует искать современные альтернативы, такие как 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 <session-name>.

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

Вариант 1: nohup

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

nohup long-running-command &

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

man nohup

Вариант 2: bg + disown

ctrl+zbgdisown -h

Если вы хотите "фоновые" уже запущенные задачи, то Ctrl+Z тогда беги bg чтобы перевести вашу последнюю приостановленную задачу в фоновый режим, позволив ей продолжить выполнение. disown процесс будет продолжен после того, как вы выйдете из системы. То -h флаг предотвращает зависание.


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 вариант без специальность аргумент ограничивает операцию выполняемыми заданиями.

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

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

  1. Установить SSH-соединение: ssh user@host
  2. Запустите нужную команду, чтобы запустить процесс
  3. Нажмите Ctrl+Z чтобы приостановить процесс
  4. Бежать bg чтобы перевести приостановленный процесс в фоновый режим и возобновить его.
  5. Бежать disown [pid] (идентификатор процесса необязателен, по умолчанию используется значение "последний процесс"), чтобы отключить процесс. Чтобы получить список заданий, просто введите jobs до.
  6. Выйдите из сеанса SSH, выполнив logout.

Использование disown команда:

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-подключений. Они являются экраном (действующим, но, к сожалению, не поддерживаются. Вероятно активно разрабатывается в настоящее время) и tmux (более новый, активно поддерживаемый). Byobu - это интерфейс, который может работать поверх любой из этих систем и предоставлять дополнительную информацию о состоянии ubuntu. При новых установках он будет использовать tmux в качестве серверной части, если у вас более старая установка byobu и существующая конфигурация, он будет поддерживать предыдущую серверную часть, будь то screen или 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, чтобы переключаться между различными окнами.

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

  • Чтобы оставить byobu и продолжить его работу (отсоединить), нажмите F6.

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

    byobu-detach-attach

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

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

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

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

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

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

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

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

Пример:

/path/to/my/script &

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

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

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

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

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

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

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

disown -a

Связанные: How can I run a command which will survive terminal close? - Unix & Linux Stack Exchange