Поиск по сайту:

Переместить запущенный процесс с одного терминала на другой, не закрывая его

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

Введение

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

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

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

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

Итак, что бы вы сделали в такой ситуации? Не волнуйтесь! Здесь вам поможет команда Reptyr.

Что такое Рептир?

Reptyr — это инструмент командной строки для перемещения запущенных процессов между ptys.

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

Просто запустите длительный процесс в удаленной системе через сеанс SSH со своего локального компьютера, закройте сеанс SSH, идите домой и повторно подключите запущенный процесс на следующий день.

Reptyr — приложение командной строки с открытым исходным кодом. Он поддерживает как Linux, так и FreeBSD.

Установите Reptyr в свои удаленные системы Linux

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

Примеры команд Tmux для управления несколькими терминальными сеансами в Linux

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

Далее вам следует установить приложение Reptyr на свои УДАЛЕННЫЕ системы.

Чтобы установить Reptyr в Arch Linux и его производных, таких как Endeavour OS и Manjaro Linux, запустите:

sudo pacman -S reptyr

В Debian, Ubuntu, Linux Mint, Pop!_OS выполните следующую команду для установки Reptyr:

sudo apt install reptyr

В Fedora, RHEL, CentOS, AlmaLinux и Rocky Linux Reptyr можно установить из репозитория EPEL.

Чтобы установить репозиторий EPEL в системах на базе RHEL, выполните следующие команды:

sudo dnf config-manager --set-enabled powertools
sudo dnf install epel-release

После включения репозитория EPEL выполните следующую команду для установки Reptyr:

sudo dnf install reptyr

Установить Reptyr из исходного кода

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

Как установить инструменты разработки в Linux

Git клонирует репозиторий Reptyr с помощью команды root или sudo:

git clone https://github.com/nelhage/reptyr.git

Перейдите в каталог Reptyr:

cd reptyr/

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

make
sudo make install

Я скомпилировал и установил Reptyr из исходного кода в 64-разрядную серверную версию CentOS 7, и он работал очень хорошо, как описано выше.

Переместите запущенный процесс с одного терминала на другой, не закрывая его, с помощью Reptyr

Убедитесь, что вы установили следующее в своих удаленных системах Linux.

  • Рептир.
  • Tmux или Экран.

Пример 1:

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

  • Удаленная система — Debian 11 Bullseye (имя пользователя — ostechnix, IP — 192.168.1.20)

Шаг 1. Подключение по SSH к удаленной системе

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

ssh remote_username@IP_of_remote_system

Я подключаюсь по SSH к своей удаленной системе (AlmaLinux 8) из локальной системы (Debian 11).

ssh ostechnix@192.168.1.20

SSH в удаленную систему Linux

Здесь «ostechnix» — это имя пользователя удаленной системы, а «192.168.1.20» — IP-адрес удаленной системы. Замените эти два значения своими.

Шаг 2. Запустите длительный процесс

После подключения к удаленной системе запустите любой длительный процесс. Я запущу команду «top».

top

Вот команда «top», работающая в моем AlmaLinux, подключенном через SSH. Назовем его Терминал 1.

Запуск команды Top в удаленной системе Linux

Как вы видите в приведенном выше выводе, я запускаю команду «top» на виртуальной машине Debian 11 через SSH из моей локальной системы. Верхняя команда будет продолжать выполняться, пока мы не остановим ее вручную, нажав CTRL+C.

Сейчас мы собираемся просто переместить процесс верхней команды внутри сеанса tmux или экрана нашей удаленной системы (например, Debian 11) с помощью Reptyr. И затем мы наконец закрываем сеанс SSH в нашей локальной системе. Во время перехода верхняя команда будет продолжать работать без каких-либо перерывов.

Шаг 3. Предыстория процесса

Теперь нажмите CTRL+Z, чтобы перевести процесс в фоновый режим. А затем запустите bg, чтобы возобновить процесс в фоновом режиме.

bg

Проверьте выполнение фоновых заданий с помощью команды jobs:

jobs -l

Здесь флаг -l будет отображать PID фонового задания.

Вы увидите следующий вывод.

[1]+  1972 Stopped (signal)        top

Предыстория процесса

Запишите PID. Он понадобится нам позже, чтобы прикрепить процесс к удаленному терминалу. Здесь PID верхней команды — 1972.

Шаг 4. Отказ от процесса

Отключите запущенный процесс от текущего родителя с помощью команды:

disown top

Пример вывода:

-bash: warning: deleting stopped job 1 with process group 1972

Теперь команда jobs -l больше не будет отображать задание, а команда ps -a будет.

ps -a
    PID TTY          TIME CMD
   1972 pts/1    00:00:00 top
   2061 pts/1    00:00:00 ps

Отречься от процесса

Шаг 5 — Запустите сеанс Tmux или Screen

Запустите новый сеанс Tmux или Screen в том же терминале или в новом окне терминала. Для простоты понимания я назову новый сеанс tmux Терминал 2.

tmux

Начать новый сеанс Tmux

Обратите внимание, что мультиплексор tmux/screen следует запускать на удаленной консоли (Debian 11), а не на консоли локальной системы.

Шаг 6 — Присоединитесь к фоновому процессу

Помните, что на шаге 3 мы поместили верхнюю команду в фоновый режим. PID фонового процесса — 1972. Если вы не помните PID, выполните команду ps -a.

Теперь присоединитесь к фоновому процессу с помощью Reptyr с помощью команды:

reptyr 1972

Присоединитесь к фоновому процессу с помощью Reptyr

Вот и все. Мы успешно переместили фоновый процесс внутри сеанса tmux.

Команда Top перенесена в сеанс Tmux

Теперь вы можете безопасно отключиться от сеанса Tmux, нажав CTRL+B и D. Он закроет только сеанс tmux, но не процесс (верхняя команда), который работает внутри него.

Мы вернулись к Терминалу 1. Проверьте список активных панелей Tmux с помощью команды:

tmux list-panes -F '#{pane_active} #{pane_pid}'
1 2072

Здесь,

  • pane_active отобразит 1, если панель активна.
  • pane_pid — это PID первого процесса на панели.

Шаг 7 — Закройте SSH-соединение

Теперь вы можете закрыть сеанс SSH. Процесс (в нашем случае команда Top) будет продолжать работать внутри сеанса Tmux вашей удаленной системы, пока ваша удаленная система работает. Закрытие SSH-соединения не завершит процесс.

Шаг 8 — Повторное подключение к Tmux

Чтобы повторно подключиться к процессу, просто подключитесь к удаленной системе по SSH:

ssh remote_user@remote_ip

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

tmux attach

Повторно подключиться к Tmux

Теперь вы увидите запущенный процесс внутри сеанса Tmux.

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

Позвольте мне показать вам еще один пример.

Пример 2:

В этом примере я использую, как переместить запущенный процесс (например, wget) на сервере CentOS.

Шаг 1. Подключение к удаленной системе по SSH.

Шаг 2. После подключения к удаленной системе запустите длительный процесс. Например, я собираюсь загрузить ISO-образ Ubuntu 16.04 для рабочего стола с помощью команды wget.

wget http://cdimage.ubuntu.com/daily-live/current/xenial-desktop-amd64.iso

Пример вывода:

Загрузите ISO-образ Ubuntu

Как вы видите на скриншоте выше, общий размер загрузки составляет 1,5 ГБ, и ее загрузка займет более 90 минут.

Я не хочу ждать так долго, а также не хочу бросать удаленную работу.

Итак, сейчас я собираюсь запустить сеанс screen или tmux в новом терминале, использовать утилиту reptyr, чтобы захватить запущенный процесс. внутри экрана или сеанса tmux. Наконец, я прерву оба сеанса SSH и снова подключусь к работающему процессу, когда захочу.

Шаг 3. Давайте откроем новое окно терминала или новую вкладку и начнем сеанс screen или tmux, набрав screen или tmux в терминале. :

screen

или

tmux

Начать сеанс экрана

Как вы видите на скриншоте выше, сеанс экрана запущен и работает.

Шаг 4. Теперь давайте найдем запущенные процессы из нового терминала, используя следующую команду:

ps -a

Пример вывода:

 PID TTY TIME CMD
 2320 pts/0 00:00:11 wget
 2343 pts/1 00:00:00 screen
 2358 pts/2 00:00:00 ps

Запишите PID для процесса wget и прикрепите запущенный процесс внутри сеанса экрана с помощью команды:

reptyr 2320

Прикрепите запущенный процесс внутри сеанса экрана с помощью Reptyr

Сделанный! Как вы видите на снимке экрана выше, процесс wget был перемещен (перенесен) из старого терминала в новое окно терминала (то, которое работает с сеансом экрана).

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

Процесс загрузки Wget остановлен

Шаг 5. Теперь вы можете безопасно отсоединить или закрыть терминал, и задание продолжит выполняться на вашем удаленном сервере.

Чтобы отключиться от сеанса экрана, нажмите CTRL+A и D. Если это сеанс Tmux, нажмите CTRL+B и D.

После отключения от сеанса экрана вы увидите следующий вывод.

[detached from 2344.pts-1.server1]

Шаг 6. Чтобы повторно подключить запущенный процесс по SSH к удаленной системе:

ssh root@192.168.1.150

Здесь. 192.168.1.150 — это IP-адрес моего удаленного сервера.

Шаг 7. Если вы используете сеанс экрана, выполните следующее:

screen -Dr

Для сеанса tmux выполните:

tmux attach

Вуаля! Запущенный процесс снова подключен, и вы увидите, что процесс загрузки все еще выполняется.

Переместите запущенный процесс с одного терминала на другой с помощью Reptyr

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

Краткое содержание

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

Рекомендуется прочитать:

  • Автозапуск сеанса Tmux в удаленной системе при входе через SSH
  • Как отобразить информацию о процессе с помощью Procs в Linux
  • Tmate — мгновенно поделитесь своим терминалом с кем угодно и где угодно
  • Как изменить тип и размер шрифта консоли Linux
  • Как заблокировать сеансы виртуальной консоли в Linux
  • Как переключаться между TTY без использования функциональных клавиш в Linux

На этом пока все, ребята. Что ж, я оставляю вам возможность познакомиться с этим полезным инструментом. Попробуйте, и вы не будете разочарованы.

Ресурсы:

  • Reptyr GitHub
  • Руководство по Рептиру

Статьи по данной тематике