Funciona perfeitamente através da linha de comando, não funcionará através do systemd ExecStart

Funciona perfeitamente através da linha de comando, não funcionará através do systemd ExecStart

eu instaleiServidor de terminal http borboleta, escrito em python, na minha máquina Arch. Sou novo no systemd, mas estou tendo problemas com um dos parâmetros da linha de comando.

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

Isso funciona conforme o esperado e posso acessar o terminal por meio de um navegador em outra máquina.

No entanto, quando criei um systemd .service simples para ele:

[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

Ele não começará --host="0.0.0.0"na linha ExecStart e reportará:

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

Se eu remover --host="0.0.0.0", ele será iniciado com êxito, mas só estará acessível na minha máquina local - outros computadores não terão acesso. Tentei então criar um Butterfly.Socket para o serviço, mas não tive sucesso ao procurar a mensagem de erro.

Por que executá-lo por meio do ExecStart é diferente de executá-lo em uma linha de comando e como iniciá-lo com esse parâmetro? Como último recurso, posso tentar modificar o script python para o padrão 0.0.0.0, mas gostaria de entender por que estou recebendo o erro, sudo systemctl restart butterfly.servicemas não ao executar diretamente.

Responder1

Quando você inicia o Butterfly a partir do Shell, ele remove aspas 0.0.0.0. Por outro lado, o systemd não faz expansão de cotações nesta situação, porque não é um shell.

Na verdade, o systemd é capaz de remover aspasem voltaargumentos, mas não no meio deles.

Portanto, tente remover aspas 0.0.0.0do seu arquivo de serviço e veja o que muda. Não se esqueça de systemctl daemon-reload.

PS: Você não pode magicamente tornar um daemon ativável por soquete apenas escrevendo uma unidade .socket. Seu código deve ser alterado para suportar a ativação do soquete.

Responder2

Eu acho que você tem algumas dependências para executar o seu butterfly.service.Durante a execução a partir da linha de comando, todos os serviços podem estar ativos e você não está enfrentando nenhum problema, mas ao iniciar, systemdalguns dos serviços de dependência podem não estar ativos e antes desses serviços your butterfly.serviceserem chegando.E tente adicionar Restart=alwaysà sua [service]seção para que, se ela travar, ela reinicie novamente.

informação relacionada