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

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

825
задан 21 October 2010 в 16:09

15 ответов

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

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

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

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

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

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

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

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

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

882
ответ дан 21 October 2010 в 16:09

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

  1. ssh [server]
  2. command
  3. Ctrl + Z
  4. bg
  5. disown [ pid процесса необязательный, по умолчанию последний]
  6. exit

Шаг 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.
67
ответ дан 21 October 2010 в 16:09

Это можно сделать с помощью экрана .

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

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

  • ssh в вашем удаленном ящике. Введите экран и запустите нужный процесс.

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

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

229
ответ дан 21 October 2010 в 16:09

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

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

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

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

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

8
ответ дан 21 October 2010 в 16:09

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

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

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

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

4
ответ дан 21 October 2010 в 16:09

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

Пример:

/path/to/my/script &

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

9
ответ дан 21 October 2010 в 16:09

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

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

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

С помощью функции -a можно закрыть клемму и запустить процесс на машине.

91
ответ дан 21 October 2010 в 16:09

Вариант 1: nohup

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

nohup long-running-command &

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

man nohup

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

ctrl+z
bg
disown -h

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


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

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

381
ответ дан 21 October 2010 в 16:09

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

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

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

3
ответ дан 21 October 2010 в 16:09

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

Byobu

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. Используй это! Некоторые подробные руководства здесь или здесь .

24
ответ дан 21 October 2010 в 16:09

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

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

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

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

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

18
ответ дан 21 October 2010 в 16:09

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

disown -a
3
ответ дан 21 October 2010 в 16:09

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

0
ответ дан 21 October 2010 в 16:09

Вместо:

cmd options; 

Добавьте перед nohup :

nohup cmd options & 

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

tail -f nohup.out
-1
ответ дан 21 October 2010 в 16:09

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

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

KillUserProcesses=no

Благодаря ответу в https://unix.stackexchange.com/questions/490267.

0
ответ дан 22 November 2019 в 22:31

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

Похожие вопросы: