Вопрос или проблема
У меня проблема с запуском веб-службы Gunicorn с использованием Systemd.
Вот файлы, которые я создал для выполнения:
Файл оболочки (/home/ubuntu/mata.sh):
#!/usr/bin/env bash
cd /home/ubuntu/workspace/test-api
/home/ubuntu/workspace/mata_venv/bin/gunicorn --workers=4 app:app --bind 0.0.0.0:xxxx
Вот мой файл .service (/lib/systemd/system/mata.service):
[Unit]
Description=Служба тестового API
After=multi-user.target
[email protected]
[Service]
User=ubuntu
Type=simple
ExecStart=/home/ubuntu/mata.sh
StandardInput=tty-force
[Install]
WantedBy=multi-user.target
Запуск скрипта оболочки самостоятельно работает хорошо, но при выполнении systemctl status mata.service
я получаю следующее сообщение:
Запущена служба тестового API
mata.service: Главный процесс вышел, код=exited, статус=216/GROUP
mata.service: Юнит вошел в состояние ошибки.
mata.service: Не удалось с результатом 'exit-code'.
Есть идеи?
У вас нет службы “Type=simple”, у вас есть служба форкинга, так как основной процесс, который вас интересует, – это процесс “gunicorn”, а не “mata.sh”.
Для службы типа simple измените раздел [Service]
на:
[Service]
User=ubuntu
Type=simple
WorkingDirectory=/home/ubuntu/workspace/test-api
ExecStart=/home/ubuntu/workspace/mata_venv/bin/gunicorn --workers=4 app:app --bind 0.0.0.0:xxxx
StandardInput=tty-force
… где я импортировал команду cd
с директивой WorkingDirectory.
Или сделайте это службой форкинга с:
[Service]
User=ubuntu
Type=forking
ExecStart=/home/ubuntu/mata.sh
StandardInput=tty-force
Вы можете предпочесть решение типа forking, если, как кажется, процесс gunicorn запускает подпроцессы (workers=4).
Ответ или решение
Проблема, с которой вы столкнулись, связана с неправильной конфигурацией вашего файла service для Gunicorn. Давайте разберем, как правильно настроить запуск вашего веб-сервиса с помощью Systemd.
Основные моменты
-
Тип сервиса: Как было замечено, вы используете
Type=simple
. Однако поскольку Gunicorn запускает дочерние процессы, правильнее будет использоватьType=forking
илиType=simple
с корректной настройкой. -
Рабочая директория: Вместо использования команды
cd
в вашем скрипте, вы можете указать рабочую директорию непосредственно в файле сервиса с помощью директивыWorkingDirectory
.
Вариант 1: Использование Type=simple
В этом варианте мы будем использовать Type=simple
и указание рабочей директории в файле сервиса.
[Unit]
Description=Test API Service
After=multi-user.target
[Service]
User=ubuntu
Type=simple
WorkingDirectory=/home/ubuntu/workspace/test-api
ExecStart=/home/ubuntu/workspace/mata_venv/bin/gunicorn --workers=4 app:app --bind 0.0.0.0:xxxx
StandardInput=tty-force
[Install]
WantedBy=multi-user.target
Вариант 2: Использование Type=forking
Если вы все-таки хотите использовать скрипт запуска и убедиться, что Gunicorn работает как фоновый процесс, вы можете настроить файл сервиса следующим образом:
[Unit]
Description=Test API Service
After=multi-user.target
[Service]
User=ubuntu
Type=forking
ExecStart=/home/ubuntu/mata.sh
StandardInput=tty-force
[Install]
WantedBy=multi-user.target
Дополнительные шаги
После внесения изменений в .service
файл, не забудьте выполнить следующие команды, чтобы перезагрузить конфигурацию systemd и запустить ваш сервис:
sudo systemctl daemon-reload
sudo systemctl start mata.service
sudo systemctl enable mata.service
Проверка статуса
Вы можете проверить статус вашего сервиса, используя следующую команду:
sudo systemctl status mata.service
Это должно показать вам, что сервис работает без ошибок. Если возникнут дополнительные проблемы, вы можете просмотреть журналы для более подробной информации:
journalctl -u mata.service -f
Заключение
С помощью этих настроек ваш Gunicorn сервис должен корректно запускаться и работать под управлением Systemd. Убедитесь, что порты и другие параметры настроены в соответствии с вашими требованиями. Если у вас все еще возникают трудности, проверьте конфигурацию вашего веб-приложения и любые другие зависимости.