Как отправить запущенный в текущем терминале процесс в фоновый режим

Ситуация - я подключился по 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.

  1. Установите screen, если он еще не установлен:
    sudo apt-get install screen  # Для Debian/Ubuntu
    sudo yum install screen      # Для CentOS/RHEL
    sudo dnf install screen      # Для Fedora
    
  2. Запустите новую сессию screen:
    screen
    
  3. Внутри сессии screen запустите длительный процесс:
    docker push r8.im/shanginn/supir
    
  4. Отключитесь от сессии screen, нажав Ctrl + A, затем D.

Теперь вы можете безопасно отключиться от SSH, а ваш процесс будет продолжать работать в фоне. Чтобы вернуться к сессии screen, используйте команду screen -r.

Перемещение уже запущенного процесса в screen с помощью reptyr

Если процесс уже запущен вне screen, как было у меня, его можно переместить в сессию screen с помощью утилиты reptyr.

  1. Установите reptyr, если он еще не установлен:
    sudo apt-get install reptyr  # Для Debian/Ubuntu
    sudo yum install reptyr      # Для CentOS/RHEL
    sudo dnf install reptyr      # Для Fedora
    
  2. Найдите PID (идентификатор процесса) вашего процесса:
    ps aux | grep docker
    
  3. Запустите новую сессию screen или переключитесь на уже существующую.

  4. Используйте reptyr -T для перемещения процесса в сессию screen:
    reptyr -T PID
    

флаг -T помечен как экспериментальный, так как он “крадёт” всю сессию, но без него, процесс с докером переместить не получилось

  1. Выполните Ctrl + A, затем D, чтобы отключиться от сессии screen.

Готово!

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