Запустить процесс в фоне linux ssh

Обновлено: 07.07.2024

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

Что если выполнение команды занимает много времени, а вы хотите выполнять другие команды в это время? У вас есть несколько вариантов в вашем распоряжении. Наиболее очевидный и простой вариант - запустить новый сеанс оболочки и запустить в нем команду. Другой вариант - запустить команду в фоновом режиме.

Фоновый процесс - это процесс / команда, которая запускается из терминала и выполняется в фоновом режиме, без взаимодействия с пользователем.


Запустите команду Linux в фоновом режиме

Чтобы выполнить команду в фоновом режиме, добавьте символ амперсанда ( & ) в конце команды:

Идентификатор задания оболочки (заключенный в квадратные скобки) и идентификатор процесса будут напечатаны на терминале:


Вы можете одновременно запускать несколько процессов в фоновом режиме.

>/dev/null 2>&1 означает перенаправление stdout на /dev/null и stderr к stdout .

Используйте jobs утилиту для отображения состояния всех остановленных и фоновых заданий в текущем сеансе оболочки:


Вывод включает в себя номер задания, идентификатор процесса, состояние задания и команду, запустившую задание:


Чтобы вывести фоновый процесс на передний план, используйте fg команду:


Если у вас есть несколько фоновых заданий, включите % и идентификатор задания после команды:


Чтобы завершить фоновый процесс, используйте kill команду, за которой следует идентификатор процесса:


Переместить процесс переднего плана в фон

Чтобы переместить запущенный процесс переднего плана в фоновом режиме:

  1. Остановите процесс, набрав Ctrl+Z .
  2. Переместите остановленный процесс в фоновом режиме, набрав bg .


Поддерживать выполнение фоновых процессов после выхода из оболочки

Если ваше соединение прерывается или вы выходите из сеанса оболочки, фоновые процессы завершаются. Есть несколько способов сохранить процесс после завершения сеанса интерактивной оболочки.

Одним из способов является удаление задания из управления заданиями оболочки с помощью disown встроенной оболочки:

Если у вас есть несколько фоновых заданий, включите % и идентификатор задания после команды:

Убедитесь, что задание удалено из таблицы активных заданий с помощью jobs -l команды. Для просмотра списка всех запущенных процессов, в том числе отключенных, используйте ps aux команду.

Другой способ сохранить процесс запущенным после выхода из оболочки - использовать nohup .

Команда nohup выполняет другую программу, указанную в качестве аргумента, и игнорирует все SIGHUP сигналы (зависания). SIGHUP это сигнал, который отправляется процессу, когда его управляющий терминал закрыт.

Чтобы запустить команду в фоновом режиме, используя nohup команду, введите:


Вывод команды перенаправляется в nohup.out файл.


Если вы выйдете из системы или закроете терминал, процесс не прекратится.

Альтернативы

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

Screen

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

Tmux - современная альтернатива экрану GNU. С Tmux вы также можете создать сеанс и открыть несколько окон внутри этого сеанса. Сеансы Tmux являются постоянными, что означает, что программы, работающие в Tmux, продолжают работать, даже если вы закрываете терминал.


Вывод

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

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

Если описать работу SSH (Secure Shell — безопасная оболочка) простыми словами, то её функция в том, что это простой способ подключиться к удалённому компьютеру от имени существующего на той системе пользователя с возможностью выполнять команды на ней. В первую очередь это относится к командам с интерфейсом командной строки, но также возможна передача и других видов трафика. В более технических терминах, когда мы подключаемся по ssh к другому пользователю на какой-либо системе и запускаем на той машине команды, то в действительности создаётся псевдо терминал и он подсоединяется к оболочке с входом (login shell) выполнившего вход пользователя.

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

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

Основы о процессах в Linux

Нормальные процессы

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

Осиротевшие процессы

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

Процессы демонов

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

Техники для сохранения запущенной SSH сессии после отключения

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

1. Использование команды screen для сохранения запущенных сессий SSH

screen — это текстовый менеджер окон для Linux, который позволяет пользователям управлять несколькими сессиями терминала одновременно, переключаться между сессиями, вести журнал действий в сессии для запущенных в screen сессий и даже возобновлять сессии в любой время по нашему желанию не беспокоясь о том, что произойдёт выход из сессии или терминал будет закрыт.

Сессии screen могут быть запущены и затем отсоединены от контролирующего терминала, что оставит их запущенными в фоне и затем их можно заново подсоединить в любое время и даже в любом месте (выполнив вход по SSH с другого компьютера). Всё что нужно, это запустить сессию в screen и когда вы хотите, отсоединить её от псевдо терминала (или контрольного терминала) и выйти из сессии. Когда нужно, вновь выполните вход по SSH и возобновите сессию.

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

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

Отсоединение экрана screen

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



Возобновление отсоединённой сессии screen

Если вы хотите возобновить отсоединённую сессию screen, которую вы оставили перед тем как отключиться, просто снова повторно залогинтесь на удалённом терминале и наберите


Предыдущая команда подходит если у вас только одна сессия screen.

Если открыто несколько сессий screen, то после опции -r нужно указать её индивидуальный идентификатор.

Следующая команда при нескольких запущенных сессиях выведет их список с идентификаторами:

Для подключения к одной из них нужно ввести команду вида:

2. Использование Tmux (мультиплексора терминалов) чтобы программа работала после отключения от SSH

Tmux — это ещё одна программ, которая создана на замену screen. В ней имеется большинство возможностей screen, а также несколько дополнительных функций, которые делают её более мощной чем screen.

Она позволяет, кроме всех других опций, которые предлагает screen, разделение экрана терминала по горизонтали и вертикали, чтобы иметь сразу несколько консолей, позволяет изменять размер этих панелей, имеется мониторинг активности сессий, поддержка скриптов используя режим командной строки и т. д. Благодаря этим функциям tmux, он имеется практически во всех дистрибутивах Unix и даже был включён в базовую систему OpenBSD.

Запуск сессии Tmux

После подключения к удалённому хосту по SSH, наберите в командной строке:

Вы откроете новую сессию с новым окном — здесь вы можете делать всё что угодно как в обычном терминале.

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

Отсоединение сессии Tmux от терминала

В запущенной сессии tmux вы можете набрать:



Либо вы можете использовать сочетание клавиш, нажмите Ctrl+b, а затем нажмите d. После этого ваша текущая сессия будет отсоединена и вы вернётесь в ваш терминал, который вы можете безопасно закрыть (отключиться от SSH).

Возобновление фоновой сессии Tmux

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


чтобы подсоединить закрытую сессию. Она вернётся, и запущенная в ней программа будет работать как прежде.

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

3. Использование команды nohup чтобы программа не закрывалась после отключения от SSH

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

Выполнение команды в фоне используя nohup

Это простой сценарий в котором во время сессии SSH мы запустили команду find для поиска файлов в фоне используя nohup. При отправке работы в фон в приглашение терминала возвращается JOBID и PID процесса.


Возобновление сессии для просмотра всё ещё работающей задачи

Когда вы повторно залогинитесь, вы можете проверить статус команды, вернув её на передней план:

%JOBID — это цифра в квадратных скобках, например [1], тогда для перевода её на передней план введите:

Если программа уже завершила свою работу, то вы увидите что-то вроде:

По умолчанию программа также сохраняет свой вывод в файл nohup.out — в противном случае, после завершения программы уже не получится вернуть данные, которые вывела программа.

При переводе на передний план программа не показывает свой вывод — в этом состоянии её можно только остановить комбинацией CTRL+c.

4.Использование команды disown для сохранения запущенной сессии SSH

Другим элегантным способом позволить вашей команде или единичной задаче работать в фоне и оставаться активной даже после выхода из сессии является использование disown.

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

Недостаток этого метода заключается в том, что его следует использовать только для заданий, которые не нуждаются в вводе из stdin (стандартного ввода) и не нуждаются в записи в stdout (стандартный вывод), если только вы не перенаправите ввод и вывод заданий, потому что, когда задание будет пытаться взаимодействовать со стандартным вводом или стандартным выводом, процесс остановится.

Выполнение команды с использованием disown в фоновом режиме

Ниже мы отправили команду ping в фоновый режим, чтобы она продолжала работать и была удалена из списка заданий. Как видно, задание было сначала приостановлено, после чего оно все ещё оставалось в списке заданий с идентификатором процесса: 4910.


После этого работе был передан сигнал disown и она была удалена из списка работ, хотя ещё и запущена в фоне. Работа должна ещё быть запущена, когда вы повторно зайдёте на удалённый сервер:


5. Использование команды setsid для поддержания сессии SSH в запущенном состоянии

Другой утилитой для достижения требуемого поведения является setsid. Nohup имеет недостаток в том смысле, что группа процессов процесса остаётся неизменной, поэтому процесс, запущенный с помощью nohup, уязвим для любого сигнала, отправляемого всей группе процессов (например, Ctrl+C).

С другой стороны, setsid распределяет новую группу процессов для выполняемого процесса, и, следовательно, созданный процесс полностью находится во вновь выделенной группе процессов и может безопасно выполняться, не опасаясь быть уничтоженным даже после выхода из сеанса.

Выполните любую команду, используя setsid


Теперь, когда вы повторно войдете в сеанс, вы все равно обнаружите, что этот процесс запущен.

Заключение

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

SSH. Запуск процесса в фоне.
Не совсем уж для новичков, но вот недавно очень пригодилось клиенту одному, дак почему бы не поделиться и здесь…

Запуск процесса в фоне.

Описанное ниже, полезно при работе по ssh на медленном соединении с обрывами (например, необходимо заархивировать что-то большое или очень много файлов скопировать, а консоль держать открытой не хочется):

1) Для начала проверим установлен ли screen, вводим команду
Код:

Если получаем что-то похожее на приведённое ниже, то пункт два пропускаем.
Код:

$ screen -v
Screen version 4.01.00devel (GNU) 2-May-06

3) Ну и, собственно сам запуск процесса.

Вводим команду
Код:

Далее вводим нужную нам команду, я, например, хочу заархивировать очень большое количество файлов
Код:

zip -r mnogofilov-100500gigov.zip /home/files

Оставляем процесс работать, а сами нажимаем Ctrl+A, затем d. Получим примерно следующее…
Код:

[detached from 3053.pts-0.blahblah]

Собственно, на этом всё. Можем спокойно отключаться от консоли, наш процесс не прервётся и продолжит своё выполнение. Если к процессу потребуется вернуться, то делаем следующее…

- Соединяемся по ssh и вводим команду screen -list, получив примерно такой результат:
Код:

screen -list
There is a screen on:
3053.pts-0.blahblah (Detached)
1 Socket in /var/run/screen/S-blah.

Это список всего что запущено в фоне. 3053.pts-0.blahblah — это как раз таки наш ранее запущенный и оставленный работать screen, войти в него можно при помощи команды
Код:

screen -r 3053.pts-0.blahblah

Аватар для eSupport

По умолчанию
А можно проще
nohup zip -r mnogofilov-100500gigov.zip /home/files > /dev/null &


Реконнект ssh при установке приложения на Ubuntu server
Запустил установку приложения в UBUNTU подключен был по ssh. В результате отвала инета произошел реконнект. Вопрос, как мне теперь увидеть "установку" приложения. его диалоговые запросы и т.п.?
ubuntu сервер Linux
06.05.13
Без имени
Ответы (2)
Сортировать по: голосам времени
3
Уже никак. Установка прервана. Надо было запускать установку в screen.
1) коннектишься по ssh
2) screen -Rd
3) запуск любых программ как обычно
4) обрыв!!1
5) коннектишься по ssh
6) screen -Rd
7) а был ли обрыв? Никто не заметил :)


Допустим, вы используете удаленную систему через SSH.

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

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

Вы начнете работу с начала? Вам не обязательно.

Здесь я даю разные 4 метода, чтобы команда запускалась после выхода из сеанса ssh.

Продолжайте выполнение команды после выхода из сеанса SSH в Linux

Могло бы быть много способов сделать это.

Однако я считаю, что следующие методы просты и понятны.

Инструмент screen, полноэкранный оконный менеджер с эмуляцией терминала VT100 / ANSI, позволяет безопасно отсоединяться от сеанса SSH без выхода из удаленного задания.

Это будет полезно для тех, кто работает с несколькими удаленными серверами.

Эта команда поставляется предварительно в большинстве операционных систем Linux.

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

На Arch Linux и производных:

На RHEL, CentOS и других системах на основе RPM:

В Debian, Ubuntu и других системах на основе DEB:

После установки в удаленных системах запустите сеанс screen:

Сеанс уже запущен.

Теперь запустите любую работу или задачу, которые вы хотите сделать в своей удаленной системе.

Я собираюсь загрузить образUbuntu 16.04:

Ubuntu 16.04 ISO составляет около 1,5 ГБ.

Обычное широкополосное подключение занимает около часа.

Вам не нужно так долго ждать.

Просто оставьте процесс загрузки, запущенный на удаленной системе, и выйдите из сеанса экрана, нажав «Ctrl-A», а затем «d».

Вы увидите вывод, как показано ниже.

После отсоединения сеанса экрана вы можете выйти из удаленной системы. Удаленное задание будет работать на сервере.

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

Вы увидите, что процесс все еще работает.

Если у вас несколько сеансов screen вам нужно ввести идентификатор сеанса экрана, чтобы повторно подключиться к нему.

Чтобы просмотреть количество сеансов экрана, запустите:

Теперь снова подключите требуемый сеанс экрана, скажем, 1382, запустите:

Для получения дополнительной информации см. Справочные страницы.

Как и инструмент «Screen», вы также можете использовать tmux для отсоединения от сеанса SSH без выхода из удаленных заданий.

Команда Tmux устанавливается на большинстве операционных систем Linux.

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

На Arch Linux и производных:

На RHEL, CentOS и других системах на основе RPM:

В Debian, Ubuntu и других системах на основе DEB:

На SUSE / OpenSUSE:

После установки tmux запустите сеанс tmux, используя команду:

Теперь начните свою задачу или задание.

Затем безопасно отделитесь от сеанса tmux, не выходя из удаленных заданий, нажав «CTRL-b», а затем «d».

Это отделит ваш сеанс tmux, но оставит вас в этом сеансе в фоновом режиме.

Это означает, что все пульты будут работать, даже если вы отключены от сеанса.

Чтобы просмотреть список доступных сеансов, запустите:

Вы можете повторно подключиться к сеансу tmux, используя соответствующий идентификатор сеанса, как показано ниже:

Для получения дополнительной информации см. Справочные страницы.

Что, если вы забыли запустить команды в screen / tmux в первую очередь?

Вот где Рептир приходит на помощь.

Reptyr помогает вам перемещать запущенные процессы между pty.

nohup, означает No hangup, еще одна утилита командной строки, которая поможет вам запускать команды Linux даже после того, как вы отключитесь от сеансов SSH.

Поскольку он является частью GNU coreutils, вам не нужно его устанавливать.

Он поставляется предварительно установленным во всех дистрибутивах Linux.

Использование абсолютно простое.

После входа в вашу удаленную систему все, что вам нужно сделать, это:

Теперь вы можете выйти из сеанса SSH. Удаленное задание будет продолжать работать.

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

Читайте также: