Команда `sudo systemctl start mybig_app` удерживается, и служба находится в состоянии загрузки (активации), никогда не переходя в активное состояние

Я разработал довольно большое приложение Django.

Я развернул его по пути /var/www/mybig_app/ на серверном компьютере (raspberry pi), подключенном к моей локальной сети.

Приложение использует библиотеки, хранящиеся в виртуальной среде /var/www/mybig_app/venv/.

Я настроил файл .wsgi, чтобы указать Gunicorn (версия 19.9.0) открыть приложение на порту 8003 локального хоста и nginx для потоковой передачи контента с порта 8003 на порт 3003.

Итак, поскольку текущий каталог равен /var/www/mybig_app/, я запускаю

python manage.py runserver localhost:8003

или

/var/www/mybig_app/venv/bin/gunicorn mybig_app.wsgi:application --bind localhost:8003

и даже если мне придется подождать около 5 секунд, в обоих случаях я могу получить доступ к своему приложению из браузера другого устройства, подключенного к моей локальной сети по адресу localhost:8003 (я пытался войти в систему как администратор, получить доступ ко всем страницам, это работает, там это не ошибка).

Теперь я хочу управлять своим приложением как услугой через systemd.

Итак, я подготовил файл .service по адресу /var/www/mybig_app/infrastructure/systemd/mybig_app.service, символически связанный с

ln -s /var/www/mybig_app/infrastructure/systemd/mybig_app.service /etc/systemd/system/
ln -s /var/www/mybig_app/infrastructure/systemd/mybig_app.service /etc/systemd/system/multi-user.target.wants/

загрузил конфигурации для systemd

sudo systemctl daemon-reload
sudo systemctl enable mybig_app.service

(Я делал это раньше для других приложений, это работает)

В итоге хочу запустить, но когда из каталога /var/www/mybig_app запускаю

sudo systemctl start mybig_app.service

Я получаю команду удержания после того, как истечет установленный мной тайм-аут в 15 секунд, и я получаю

Job for mybig_app.service failed because a timeout was exceeded.
See "systemctl status mybig_app.service" and "journalctl -xe" for details.

Поэтому я бегу

journalctl -xe

и я вижу

-- 
-- A stop job for unit mybig_app.service has finished.
-- 
-- The job identifier is 20135 and the job result is done.
May 08 17:48:02 Raspberry100 systemd[1]: Starting service for starting the app mybig_app on RPi...
-- Subject: A start job for unit mybig_app.service has begun execution
-- Defined-By: systemd
-- Support: https://www.debian.org/support
-- 
-- A start job for unit mybig_app.service has begun execution.
-- 
-- The job identifier is 20135.
May 08 17:48:05 Raspberry100 sudo[1806]:     root : TTY=pts/1 ; PWD=/var/www/mybig_app ; USER=root ; COMMAND=/bin/systemctl daemon-reload
May 08 17:48:05 Raspberry100 sudo[1806]: pam_unix(sudo:session): session opened for user root by pi(uid=0)
May 08 17:48:05 Raspberry100 systemd[1]: Reloading.
May 08 17:48:05 Raspberry100 sudo[1806]: pam_unix(sudo:session): session closed for user root
May 08 17:48:09 Raspberry100 sudo[1838]:     root : TTY=pts/1 ; PWD=/var/www/mybig_app ; USER=root ; COMMAND=/bin/systemctl start mybig_app.
May 08 17:48:09 Raspberry100 sudo[1838]: pam_unix(sudo:session): session opened for user root by pi(uid=0)
May 08 17:48:18 Raspberry100 systemd[1]: mybig_app.service: Start operation timed out. Terminating.
May 08 17:48:18 Raspberry100 systemd[1]: mybig_app.service: Failed with result 'timeout'.
-- Subject: Unit failed
-- Defined-By: systemd
-- Support: https://www.debian.org/support
-- 
-- The unit mybig_app.service has entered the 'failed' state with result 'timeout'.
May 08 17:48:18 Raspberry100 systemd[1]: Failed to start service for starting the app mybig_app on RPi.
-- Subject: A start job for unit mybig_app.service has failed
-- Defined-By: systemd
-- Support: https://www.debian.org/support
-- 
-- A start job for unit mybig_app.service has finished with a failure.
-- 
-- The job identifier is 20135 and the job result is failed.
May 08 17:48:18 Raspberry100 sudo[1838]: pam_unix(sudo:session): session closed for user root

В чем здесь проблема?

мои гипотезы

Я думаю, что это каким-то образом связано с содержимым моего файла mybig_app.service, но в прошлом я использовал ту же процедуру и для других приложений, просто меняя имя проекта, и это всегда работало.

Еще одной проблемой могут быть установленные библиотеки, которые довольно старые (проект 2018 года).

Обратите внимание: поскольку приложению потребовалось несколько секунд (не более 5) для установки, когда я запускал его через Python и Gunicorn, в моем файле .service я установил

[Service]
...

# RestartSec=100ms # this is the default
RestartSec=15s
TimeoutStartSec=15s
TimeoutSec=15s

чтобы дать ему больше времени для настройки (тайм-аут перезапуска по умолчанию составляет 0,1 секунды).

Что я пробовал

Я удалил и воссоздал виртуальную среду.

Я перезагрузил серверную машину.

Я попытался увеличить тайм-аут до 115 секунд.

Отладка

Я заметил, что пока держится команда пуска, Я могу получить доступ к своему приложению и перемещаться по нему из браузера другого устройства, подключенного к моей локальной сети.

сходство с другими вопросами SO

Проблема аналогична этой, поскольку я не могу запустить или перезапустить свое приложение как службу, но могу успешно запустить его через Python или Gunicorn. Однако в моем случае в качестве веб-сервера я использую не httpd, а nginx, который отлично работает с другими приложениями, настроенными таким же образом.

содержимое файлов

mybig_app.service

[Unit]
# the first line must be 
# [Unit]

#------------------------------------------------------------------------

# what to do with this file

# this file must be named
# <target_app>.service
# and deployed to
# /etc/systemd/system 
# to be ran on boot.

# Once in the folder make the file executable 
# sudo chmod +x <target_app>.service

# This will start the service but will not run it on boot.
# sudo systemctl start <target_app>.service

# To make your service automatically run on boot
# sudo systemctl daemon-reload
# sudo systemctl enable <target_app>.service

# Run this in terminal to disable the program on boot
# sudo systemctl daemon-reload
# sudo systemctl disable <target_app>.service

# Documentation https://www.freedesktop.org/software/systemd/man/systemd.service.html

#------------------------------------------------------------------------

Description=service for starting the app mybig_app on RPi

After=network.target
# This will not start execution of this file until the network connection is made
# It can be replaced with other parameters of your choosing
# e.g.
# After=syslog.target


[Service]
WorkingDirectory=/var/www/mybig_app/
ExecStart=/var/www/mybig_app/venv/bin/gunicorn mybig_app.wsgi:application --bind localhost:8003

StandardOutput=file:/var/log/mybig_app/mybig_app-stdout.log
StandardError=file:/var/log/mybig_app/mybig_app-stderr.log
#Optional: Saves the output and error log of the terminal to a .log file in a directory of your choosing.

Restart=always
# Automatically restart on kill

# RestartSec=100ms # this is the default
RestartSec=15s
TimeoutStartSec=15s
TimeoutSec=15s

KillSignal=SIGQUIT
# Optional: To cleanly end the file on stop use this command. This sends a terminal interrupt command on the executable script
# alternatively:
# Restart=on-failure

Type=notify
NotifyAccess=all


[Install]
WantedBy=multi-user.target

Какую версию Gunicorn вы используете?

Abdul Aziz Barkat 09.05.2024 11:25

@AbdulAzizBarkat пушка == 19.9.0

Tms91 09.05.2024 14:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, проблема в том, что systemd не знает, что служба запущена, я думаю, вам следует сделать server.Type=exec, как указано в systemd help

Ответ принят как подходящий

Когда вы используете Type=notify, systemd ожидает уведомления от службы через sd_notify , поддержка этого была добавлена ​​только в Gunicorn в версии 20.0 (см. следующий комментарий к проблеме на GitHub).

Если вы хотите использовать Type=notify, вам следует обновить версию Gunicorn, в противном случае вы можете просто установить Type=exec.

Спасибо!! обновление Gunicorn до 20.0.4 решило проблему.

Tms91 12.05.2024 11:35

Другие вопросы по теме