Läuft perfekt über die Befehlszeile, funktioniert nicht über systemd ExecStart

Läuft perfekt über die Befehlszeile, funktioniert nicht über systemd ExecStart

Ich habe installiertButterfly-HTTP-Terminalserver, geschrieben in Python, auf meiner Arch-Maschine. Ich bin neu bei systemd, habe aber ein Problem mit einem der Befehlszeilenparameter.

/usr/bin/butterfly.server.py --shell=/usr/fish --unsecure --host="0.0.0.0"

Dies funktioniert wie erwartet und ich kann über einen Webbrowser auf einem anderen Computer auf das Terminal zugreifen.

Als ich jedoch einen einfachen systemd .service dafür erstellte:

[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

Es beginnt nicht mit --host="0.0.0.0"in der ExecStart-Zeile und meldet:

[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.

Wenn ich dann entferne --host="0.0.0.0", wird es erfolgreich gestartet, ist aber nur auf meinem lokalen Computer zugänglich – anderen Computern wird kein Zugriff gewährt. Ich habe dann versucht, einen Butterfly.Socket für den Dienst zu erstellen, konnte die Fehlermeldung jedoch nicht nachschlagen.

Warum ist die Ausführung über ExecStart anders als die Ausführung über eine Befehlszeile und wie starte ich es mit diesem Parameter? Als letzten Ausweg kann ich versuchen, das Python-Skript so zu ändern, dass es stattdessen standardmäßig verwendet wird 0.0.0.0, aber ich würde gerne verstehen, warum ich den Fehler erhalte, sudo systemctl restart butterfly.serviceaber nicht bei der direkten Ausführung.

Antwort1

Wenn Sie Butterfly von einer Shell aus starten, werden die Anführungszeichen um entfernt 0.0.0.0. Andererseits führt systemd in dieser Situation keine Anführungszeichenerweiterung durch, da es keine Shell ist.

Tatsächlich ist systemd in der Lage, Anführungszeichen zu entfernenumArgumente, aber nicht mittendrin.

Versuchen Sie also, die Anführungszeichen 0.0.0.0in Ihrer Servicedatei zu entfernen und sehen Sie, was sich ändert. Vergessen Sie nicht systemctl daemon-reload, …

PS: Sie können einen Daemon nicht auf magische Weise socketaktivierbar machen, indem Sie einfach eine .socket-Unit schreiben. Der Code muss geändert werden, um die Socket-Aktivierung zu unterstützen.

Antwort2

Ich nehme an, dass Sie zum Ausführen einige Abhängigkeiten haben butterfly.service. Beim Ausführen über die Befehlszeile sind möglicherweise alle Dienste aktiv und Sie haben keine Probleme, aber beim Starten systemdsind möglicherweise einige der Abhängigkeitsdienste nicht aktiv und bevor diese Dienste your butterfly.serviceaktiviert werden. Versuchen Sie, Restart=alwaysIhrem [service]Abschnitt etwas hinzuzufügen, sodass es sich bei einem Absturz von selbst neu startet.

verwandte Informationen