Почему мой бутылочный сервер не работает при запуске?

Я написал небольшой сервер, используя Python и Bottle, а также модуль systemd, чтобы установить его как службу на xubuntu. Скрипт python работает как положено, и сервис работает нормально, если я запускаю его из командной строки (sudo systemctl advairMeter), но при запуске системы происходит сбой.

Вот мой файл .service:

saul@linuxBox:~/Desktop$ cat /etc/systemd/system/advairMeter.service
[Unit]
Description=Advair meter
After=network.target

[Service]
ExecStart=/usr/bin/python3  server.py
Restart=always
WorkingDirectory=/home/saul/Projects/PythonProjects/medSched/

[Install]
WantedBy=multi-user.target

Вот что происходит при перезагрузке:

Apr 09 08:43:49 linuxBox systemd[1]: Started Advair meter.
Apr 09 08:43:49 linuxBox python3[1176]: Bottle v0.12.19 server starting up (using WSGIRefServer())...
Apr 09 08:43:49 linuxBox python3[1176]: Listening on http://192.168.1.103:8080/
Apr 09 08:43:49 linuxBox python3[1176]: Hit Ctrl-C to quit.
Apr 09 08:43:50 linuxBox python3[1176]: Traceback (most recent call last):
Apr 09 08:43:50 linuxBox python3[1176]:   File "server.py", line 95, in <module>
Apr 09 08:43:50 linuxBox python3[1176]:     run(host='192.168.1.103', port=8080)
Apr 09 08:43:50 linuxBox python3[1176]:   File "/usr/local/lib/python3.8/dist-packages/bottle.py", line 3137, in run
Apr 09 08:43:50 linuxBox python3[1176]:     server.run(app)
Apr 09 08:43:50 linuxBox python3[1176]:   File "/usr/local/lib/python3.8/dist-packages/bottle.py", line 2789, in run
Apr 09 08:43:50 linuxBox python3[1176]:     srv = make_server(self.host, self.port, app, server_cls, handler_cls)
Apr 09 08:43:50 linuxBox python3[1176]:   File "/usr/lib/python3.8/wsgiref/simple_server.py", line 154, in make_server
Apr 09 08:43:50 linuxBox python3[1176]:     server = server_class((host, port), handler_class)
Apr 09 08:43:50 linuxBox python3[1176]:   File "/usr/lib/python3.8/socketserver.py", line 452, in __init__
Apr 09 08:43:50 linuxBox python3[1176]:     self.server_bind()
Apr 09 08:43:50 linuxBox python3[1176]:   File "/usr/lib/python3.8/wsgiref/simple_server.py", line 50, in server_bind
Apr 09 08:43:50 linuxBox python3[1176]:     HTTPServer.server_bind(self)
Apr 09 08:43:50 linuxBox python3[1176]:   File "/usr/lib/python3.8/http/server.py", line 138, in server_bind
Apr 09 08:43:50 linuxBox python3[1176]:     socketserver.TCPServer.server_bind(self)
Apr 09 08:43:50 linuxBox python3[1176]:   File "/usr/lib/python3.8/socketserver.py", line 466, in server_bind
Apr 09 08:43:50 linuxBox python3[1176]:     self.socket.bind(self.server_address)
Apr 09 08:43:50 linuxBox python3[1176]: OSError: [Errno 99] Cannot assign requested address
Apr 09 08:43:50 linuxBox systemd[1]: advairMeter.service: Main process exited, code=exited, status=1/FAILURE
Apr 09 08:43:50 linuxBox systemd[1]: advairMeter.service: Failed with result 'exit-code'.
Apr 09 08:43:50 linuxBox systemd[1]: advairMeter.service: Scheduled restart job, restart counter is at 4.
Apr 09 08:43:50 linuxBox systemd[1]: Stopped Advair meter.

Теперь первая часть вывода журнала выше,

Bottle v0.12.19 server starting up (using WSGIRefServer())...
Listening on http://192.168.1.103:5678/
Hit Ctrl-C to quit.

это то, что я вижу, если я просто запускаю скрипт python с помощью python3 server.py, поэтому похоже, что скрипт действительно выполняется, и тогда имеет смысл, что адрес не может быть назначен, поскольку сокет уже использует его, но тогда почему Есть ли процесс прослушивания этого сообщения после завершения перезагрузки?

Сам скрипт на питоне очень простой,

<SNIP>
@route('/')
@auth_basic(is_authenticated_user)
def home():
   <SNIP>
run(host='192.168.1.103', port=8080)

Я предполагаю, что ошибка в моем файле .service, но я не смог найти в Интернете ничего, что подсказывало бы мне, как это исправить. Это мой первый опыт работы как с бутылкой, так и с systemd, так что, скорее всего, я делаю очень простую ошибку.

Ошибка OSError: [Errno 99] Cannot assign requested address. У вас уже есть что-то, прослушивающее порт 8080?

larsks 09.04.2022 17:37

@larsks Как я уже сказал, похоже, что сервер запускается и слушает этот порт. Обратите внимание, что счетчик перезапуска равен 4. Каждый раз, когда служба перезапускается, я вижу сообщение «прослушивание...» в выводе журнала.

saulspatz 09.04.2022 19:23

@larsks Кроме того, я попробовал это со случайным портом, 5678, и происходит то же самое.

saulspatz 09.04.2022 19:28

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

saulspatz 09.04.2022 19:36

Из тега: systemd вопросы должны быть для вопросы по программированию с использованием systemd или его библиотек. Вопросы о настройка демона (включая написание юнит-файлов) лучше адресовать Unix и Linux: unix.stackexchange.com.

Rob 10.04.2022 13:45
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
5
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Существует большая вероятность того, что ваша служба будет запущена до того, как ваша сеть будет настроена во время загрузки. Это означает, что ваша ОС не имеет сетевых интерфейсов для прослушивания, и поэтому ваш сценарий не будет работать. Чтобы это исправить, измените раздел [Unit] на это:

[Unit]
Description=Advair meter
Wants=network-online.target
After=network.target network-online.target

Вы можете проверить Заставить скрипт выполняться после запуска сети? для более подробной информации.

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