![Läuft perfekt über die Befehlszeile, funktioniert nicht über systemd ExecStart](https://rvso.com/image/36000/L%C3%A4uft%20perfekt%20%C3%BCber%20die%20Befehlszeile%2C%20funktioniert%20nicht%20%C3%BCber%20systemd%20ExecStart.png)
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.service
aber 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.0
in 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 systemd
sind möglicherweise einige der Abhängigkeitsdienste nicht aktiv und bevor diese Dienste your butterfly.service
aktiviert werden. Versuchen Sie, Restart=always
Ihrem [service]
Abschnitt etwas hinzuzufügen, sodass es sich bei einem Absturz von selbst neu startet.