
Я установилButterfly http терминальный сервер, написанный на python, на моей машине Arch. Я новичок в systemd, но у меня возникла проблема с одним из параметров командной строки.
/usr/bin/butterfly.server.py --shell=/usr/fish --unsecure --host="0.0.0.0"
Все работает так, как и ожидалось, и я могу получить доступ к терминалу через веб-браузер на другом компьютере.
Однако, когда я создал для него простую systemd .service:
[Unit]
Description=Butterfly Terminal Server
[Service]
ExecStart=/usr/bin/butterfly.server.py --shell=/bin/fish --host="0.0.0.0" --unsecure
[Install]
WantedBy=multi-user.target
Он не будет начинаться со --host="0.0.0.0"
строки ExecStart и выдаст следующие отчеты:
[root@ArchHP sockets.target.wants]# systemctl status butterfly.service -l
● butterfly.service - Butterfly Terminal Server
Loaded: loaded (/usr/lib/systemd/system/butterfly.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Wed 2015-01-07 23:08:29 CST; 26s ago
Process: 3203 ExecStart=/usr/bin/butterfly.server.py --shell=/bin/fish --host="0.0.0.0" --unsecure (code=exited, status=1/FAILURE)
Main PID: 3203 (code=exited, status=1/FAILURE)
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: File "/usr/lib/python3.4/site-packages/tornado/tcpserver.py", line 125, in listen
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: sockets = bind_sockets(port, address=address)
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: File "/usr/lib/python3.4/site-packages/tornado/netutil.py", line 106, in bind_sockets
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: 0, flags)):
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: File "/usr/lib/python3.4/socket.py", line 530, in getaddrinfo
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: socket.gaierror: [Errno -2] Name or service not known
Jan 07 23:08:29 ArchHP systemd[1]: butterfly.service: main process exited, code=exited, status=1/FAILURE
Jan 07 23:08:29 ArchHP systemd[1]: Unit butterfly.service entered failed state.
Jan 07 23:08:29 ArchHP systemd[1]: butterfly.service failed.
Если я затем удалю --host="0.0.0.0"
, он успешно запустится, но будет доступен только на моей локальной машине - другим компьютерам доступ предоставлен не будет. Затем я попытался создать butterfly.socket для службы, но не добился успеха в поиске сообщения об ошибке.
Почему запуск через ExecStart отличается от запуска в командной строке, и как мне запустить его с этим параметром? В крайнем случае, я могу попробовать изменить скрипт python, чтобы вместо этого использовать default на 0.0.0.0
, но я хотел бы понять, почему я получаю ошибку с, sudo systemctl restart butterfly.service
но не при выполнении напрямую.
решение1
Когда вы запускаете butterfly из оболочки, она удаляет кавычки вокруг 0.0.0.0
. С другой стороны, systemd не делает раскрытие кавычек в этой ситуации, потому что это не оболочка.
На самом деле systemd умеет убирать кавычкивокругспоры, но не посреди них.
Итак, попробуйте убрать кавычки 0.0.0.0
в вашем файле сервиса и посмотрите, что изменится. Не забудьте systemctl daemon-reload
.
PS: Вы не можете волшебным образом сделать демона активируемым через сокет, просто написав модуль .socket. Его код должен быть изменен для поддержки активации через сокет.
решение2
Я полагаю, у вас есть некоторые зависимости для запуска вашего butterfly.service
. При запуске из командной строки все службы могут быть запущены, и вы не столкнетесь с какими-либо проблемами, но при запуске из командной строки systemd
некоторые из зависимых служб могут быть не запущены, и эти службы your butterfly.service
будут запущены до того, как они запустятся. И попробуйте добавить Restart=always
в свой [service]
раздел, чтобы в случае сбоя он должен был перезапуститься снова.