Я написал небольшой сервер, используя 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, так что, скорее всего, я делаю очень простую ошибку.
@larsks Как я уже сказал, похоже, что сервер запускается и слушает этот порт. Обратите внимание, что счетчик перезапуска равен 4. Каждый раз, когда служба перезапускается, я вижу сообщение «прослушивание...» в выводе журнала.
@larsks Кроме того, я попробовал это со случайным портом, 5678, и происходит то же самое.
@larsks Я также проверил с помощью netstat, и ни на одном из портов, которые я пробовал, ничего нет.
Из тега: systemd вопросы должны быть для вопросы по программированию с использованием systemd или его библиотек. Вопросы о настройка демона (включая написание юнит-файлов) лучше адресовать Unix и Linux: unix.stackexchange.com.
Существует большая вероятность того, что ваша служба будет запущена до того, как ваша сеть будет настроена во время загрузки. Это означает, что ваша ОС не имеет сетевых интерфейсов для прослушивания, и поэтому ваш сценарий не будет работать.
Чтобы это исправить, измените раздел [Unit]
на это:
[Unit]
Description=Advair meter
Wants=network-online.target
After=network.target network-online.target
Вы можете проверить Заставить скрипт выполняться после запуска сети? для более подробной информации.
Ошибка
OSError: [Errno 99] Cannot assign requested address
. У вас уже есть что-то, прослушивающее порт 8080?