Прекрасно работает через командную строку, не работает через systemd ExecStart

Прекрасно работает через командную строку, не работает через systemd ExecStart

Я установил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]раздел, чтобы в случае сбоя он должен был перезапуститься снова.

Связанный контент