Как отправить запущенный в текущем терминале процесс в фоновый режим
Ситуация - я подключился по ssh к своему серверу и поставил пушить слои докер образа. Образ оказался большой, интернет оказался медленный, а соединение может быть нестабильным. Поэтому встал вопрос, как же вот этот вот открытый сейчас у меня в ssh сессии процесс отправить работать в фон, чтобы я мог спокойно отключиться?
bg
В Linux есть простой способ отправить процесс в фоновый режим - это использование команды bg
.
Но для начала, нужно приостановить процесс, нажав Ctrl + Z
, а затем выполнить команду bg
,
чтобы продолжить его выполнение в фоне.
$ docker push r8.im/shanginn/supir
^Z
[1]+ Stopped docker push r8.im/shanginn/supir
$ bg
[1]+ docker push r8.im/shanginn/supir &
Однако, это не решает проблему полностью, так как при разрыве соединения SSH фоновый процесс будет остановлен.
Использование screen
для управления фоновыми процессами
Для более надежного управления фоновыми процессами можно использовать утилиту screen
. screen
позволяет создавать сессии, которые продолжают работать в фоне даже после отключения от SSH.
- Установите
screen
, если он еще не установлен:sudo apt-get install screen # Для Debian/Ubuntu sudo yum install screen # Для CentOS/RHEL sudo dnf install screen # Для Fedora
- Запустите новую сессию
screen
:screen
- Внутри сессии
screen
запустите длительный процесс:docker push r8.im/shanginn/supir
- Отключитесь от сессии
screen
, нажавCtrl + A
, затемD
.
Теперь вы можете безопасно отключиться от SSH, а ваш процесс будет продолжать работать в фоне.
Чтобы вернуться к сессии screen
, используйте команду screen -r
.
Перемещение уже запущенного процесса в screen
с помощью reptyr
Если процесс уже запущен вне screen
, как было у меня,
его можно переместить в сессию screen
с помощью утилиты reptyr
.
- Установите
reptyr
, если он еще не установлен:sudo apt-get install reptyr # Для Debian/Ubuntu sudo yum install reptyr # Для CentOS/RHEL sudo dnf install reptyr # Для Fedora
- Найдите PID (идентификатор процесса) вашего процесса:
ps aux | grep docker
-
Запустите новую сессию
screen
или переключитесь на уже существующую. - Используйте
reptyr -T
для перемещения процесса в сессиюscreen
:reptyr -T PID
флаг
-T
помечен как экспериментальный, так как он “крадёт” всю сессию, но без него, процесс с докером переместить не получилось
- Выполните
Ctrl + A
, затемD
, чтобы отключиться от сессииscreen
.
Готово!
Теперь ваш процесс будет продолжать работать в сессии screen
, и вы можете безопасно отключиться от SSH.