O serviço python Systemd armazena em buffer a saída journalctl mesmo com -u

1

Eu tenho um serviço systemd de usuário simples configurado da seguinte forma:

[Unit]
Description=Bot
AssertPathExists=/home/mikel/discord-bot/

[Service]
WorkingDirectory=/home/mikel/discord-bot/
ExecStart=/home/mikel/anaconda3/bin/python -u bot.py parameters.json
Restart=always
RestartSec=3

[Install]
WantedBy=default.target

Essencialmente, todo o serviço é executado em um script python.

No entanto, quando olho para o journalctl do serviço, vejo que, em vez de os logs aparecerem como acontecem no script, tudo é liberado imediatamente quando o serviço é interrompido (com o mesmo timestamp para cada linha ).

Isso sugere que algum buffer está ocorrendo em algum lugar que está impedindo que ele seja gravado no journalctl imediatamente. No entanto, mesmo quando eu desligo o buffer interno do Python com -u , o problema ainda ocorre.

Uma solução que encontrei é envolvê-la no comando unbuffer do pacote expect , assim:

ExecStart=/usr/bin/unbuffer /home/mikel/anaconda3/bin/python -u bot.py parameters.json

No entanto, enquanto isso funciona, significa que journalctl mostra "unbuffer [PID]" em vez de "python [PID]", e eu quero uma solução que não envolva a instalação de pacotes externos para o que parece ser uma tarefa simples.

Existe alguma outra maneira de remover esses buffers para que a saída seja liberada para o journalctl, já que ela é proveniente do python?

    
por mxbi 24.04.2018 / 15:06

1 resposta

1

Por meio de sua experiência com unbuffer , você estabeleceu que o armazenamento em buffer está acontecendo no comando que está executando, não em systemd .

Portanto, o buffer está acontecendo no código python que você escreveu. Para resolver isso, você precisa revisar o código que você escreveu ou postar o código aqui com uma pergunta.

    
por 24.04.2018 / 20:48