
he instaladoServidor terminal http mariposa, escrito en Python, en mi máquina Arch. Soy nuevo en systemd, pero tengo un problema con uno de los parámetros de la línea de comando.
/usr/bin/butterfly.server.py --shell=/usr/fish --unsecure --host="0.0.0.0"
Esto funciona como se esperaba y puedo acceder al terminal a través de un navegador web en otra máquina.
Sin embargo, cuando creé un .servicio systemd simple para ello:
[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
No comenzará --host="0.0.0.0"
en la línea ExecStart e informa:
[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.
Si luego elimino --host="0.0.0.0"
, se iniciará correctamente, pero solo será accesible en mi máquina local; no se concederá acceso a otras computadoras. Luego intenté crear un Butterfly.socket para el servicio, pero no tuve éxito al buscar el mensaje de error.
¿Por qué ejecutarlo a través de ExecStart es diferente a ejecutarlo en una línea de comando y cómo lo inicio con ese parámetro? Como último recurso, puedo intentar modificar el script de Python para que tenga el valor predeterminado 0.0.0.0
, pero me gustaría entender por qué recibo el error sudo systemctl restart butterfly.service
pero no cuando lo ejecuto directamente.
Respuesta1
Cuando inicias Butterfly desde Shell, se eliminan las comillas 0.0.0.0
. Por otro lado, systemd no realiza expansión entre comillas en esta situación, porque no es un shell.
En realidad, systemd es capaz de eliminar comillas.alrededorargumentos, pero no en medio de ellos.
Por lo tanto, intente eliminar las comillas 0.0.0.0
en su archivo de servicio y vea qué cambios. No olvides systemctl daemon-reload
.
PD: No puedes hacer que un demonio se pueda activar mágicamente simplemente escribiendo una unidad .socket. Su código debe cambiarse para admitir la activación del socket.
Respuesta2
Supongo que tiene algunas dependencias para ejecutar su butterfly.service
. Mientras se ejecuta desde la línea de comandos, es posible que todos los servicios estén activos y no enfrente ningún problema, pero al comenzar desde la línea de comandos, systemd
es posible que algunos de los servicios de dependencia no estén activos y antes de que esos servicios your butterfly.service
estén activos. próximamente. E intente agregar Restart=always
a su [service]
sección para que, si falla, se reinicie nuevamente.