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