Перейти к содержанию

Запускаем процессы в фоне с помощью screen

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

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

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

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

Установка

Чтобы установить screen, воспользуйтесь менеджером пакетов для вашей системы

apt install screen

Работа с сессиями

Попробуем создать новую сессию:

screen -S my_first_screen_session

Будет запущена новая сессия, как если бы вы авторизовались на сервере в обычной tty-консоли. В ней можно запустить какой-то процесс, «свернуть» ее и продолжить работать в консоли.

Чтобы «свернуть» сессию, нажмите Ctrl+A, затем d. Первый шорткат переведет скрин режим принятия команд, а команда d (disconnect) отключится от текущей сессии, оставив ее запущенной в фоне.

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

screen -r
Для того, чтобы получить список запущенных сессий от имени текущего пользователя, добавьте ключ -ls или -list
screen -list
Вы можете подключиться к определенной сессии по её имени (идентификатору), добавив его в конце команды
screen -r mc
Чтобы завершить определенную сессию, можно отправить в нее выполнение команды «quit»
screen -S mc -X quit

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

Чтобы сразу запустить в скрине какой-то процесс, достаточно передать команду на его выполнение при запуске сессии

screen -S session_name command

Например так:

screen -S mc python main.py

Перед вами откроется новый скрин, где будет выполняться переданная команда. Теперь можно свернуть скрин и процесс продолжит выполнение. Ctrl+A, D.

Важно помнить что при подобном запуске, если процесс завершит свое выполнение (например, вследствие ошибки), то скрин также завершит работу. Если вы хотите иметь возможность посмотреть вывод процесса (узнать текст ошибки) в случае остановки скрипта в скрине, запускайте его в два этапа: сперва создаем сессию, потом запускаем в ней процесс — так вы сможете зайти в скрин с помощью -r

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

Чтобы запустить скрин сразу в свернутом виде, нужно дополнительно передать параметры -dm

screen -dmS session_name command

Рекомендуется либо заранее проверить, что переданная команда запускается корректно. Иначе вы увидите только сообщение о том, что скрин завершил работу.

[screen is terminating]

Заключение

Screen позволяет использовать терминальные сессии, которые можно «сворачивать». С его помощью можно запускать в фоне ресурсоемкие задачи и процессы, которые должны быть запущены постоянно.