![Funciona perfeitamente através da linha de comando, não funcionará através do systemd ExecStart](https://rvso.com/image/36000/Funciona%20perfeitamente%20atrav%C3%A9s%20da%20linha%20de%20comando%2C%20n%C3%A3o%20funcionar%C3%A1%20atrav%C3%A9s%20do%20systemd%20ExecStart.png)
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.service
mas 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.0
do 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, systemd
alguns dos serviços de dependência podem não estar ativos e antes desses serviços your butterfly.service
serem chegando.E tente adicionar Restart=always
à sua [service]
seção para que, se ela travar, ela reinicie novamente.