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

4 min read

Работая через терминал, вы запускаете процессы в текущей сессии. Если закрыть окно, выполнение процесса будет завершено, а результат утерян. Это является проблемой при выполнении ресурсоемких задач (сложных sql-запросов, работы с большими объемами данных и так далее), которые могут занять продолжительное время. К тому же, любая запущенная команда блокирует терминал до своего завершения, лишая вас возможности выполнять другие операции.

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

Помимо выполнения долгих скриптов, screen можно использовать для запуска программ, которые должны работать на сервере в фоне. Например, мы нередко используем его для запуска проектов на nodejs или python, работы shell-скриптов. Для запуска фоновых процессов на продакшн-сервере лучше использовать утилиту 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 Hawk

Чтобы завершить определенную сессию, можно отправить в нее выполнение команды «quit»

$ screen -S Hawk -X quit

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

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

$ screen -S <session_name> <command>

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

$ screen -S Hawk node index.js

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

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

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

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

$ screen -dmS <session_name> <command>

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

[screen is terminating]

Вывод

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