systemd em 15.04 não registrará stdout da unidade

12

Atualmente, estou tentando criar uma unidade systemd como um servidor web. Atualmente, meu foo.servicearquivo tem a seguinte aparência:

[Unit]
Description=The Foo Web Server

[Service]
Type=simple
ExecStart=/opt/foo/.cabal-sandbox/bin/foo

[Install]
WantedBy=multi-user.target

O fooexecutável registra automaticamente todas as solicitações HTTP no stdout - isso é bem testado. No entanto, quando visualizo os logs com journalctl -u foo, apenas recebo resultados como este:

...
May 06 17:46:57 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:46:57 localhost systemd[1]: Started Foo Web Server.
May 06 17:46:57 localhost systemd[1]: Starting The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Started The Foo Web Server.
May 06 17:47:08 localhost systemd[1]: Starting The Foo Web Server...

Alguém poderia explicar por que não está registrando todas as saídas stdout? Eu olhei brevemente para esta pergunta anterior , mas ela não ajuda - no entanto, aludiu a algo como "... pode não funcionar para sistemas que não usam o systemd completo " - seria este o caso do Ubuntu 15.04 ? Agradecemos antecipadamente, qualquer ajuda com isso seria muito apreciada!

Athan Clark
fonte
1
Verifique se o seu processo não está armazenando em buffer a saída. Eu estava tendo um problema semelhante e foi resolvido desativando o buffer de saída do meu script python. Como o número de registros de log produzidos não era alto, parecia que não havia registro, mas, na verdade, ainda não havia chance, pois tudo ainda estava reunido no buffer de saída stdout.
Jan Vlcinsky
1
Tentando consertar isso também. Tenho a impressão de que o systemd faz buffer. O stdout possui buffer de linha no UNIX, mas o systemd faz suas próprias coisas e armazena em buffer muito mais (para ser rápido, mas inútil, talvez).
Velkan
Eu tive o mesmo problema e o buffer da função de impressão do Python foi o problema! Desde que eu estava usando o Python 3, usei algo parecido print('Hello World!', flush=True)e isso fez o truque! A saída começou a aparecer no journalctl.
timbram

Respostas:

9

De fato, o buffer no UNIX depende do contexto: quando o stdout é redirecionado para algo interativo como um console - geralmente é buffer de linha, caso contrário, é totalmente bufferizado.

O buffer pode ser alterado dentro do aplicativo usando a chamada de biblioteca setvbuf .

Mas isso também pode ser feito com o comando stdbuf no lançamento:

ExecStart=/usr/bin/stdbuf -oL /opt/foo/.cabal-sandbox/bin/foo

(para maiúsculas e minúsculas)

Velkan
fonte
Isso salvou meu dia! Muito obrigado. Mas estou um pouco confuso com o ExecStart=/my/foo/programmotivo pelo qual o log stdout não é liberado quando o serviço é finalizado, mas desaparece completamente.
Wlnirvana 15/08/19
0

Por padrão no Ubuntu 15.04 , os diários do systemd são apenas voláteis, mantidos /run/systemd/journale perdidos a cada reinicialização. Para usar o diário systemd persistente , é necessário criar o diretório (e reiniciar o systemd-journald.service)./var/log/journal

Portanto, a stdoutsaída é apenas redirecionada sysloge não mantida no diário systemd . Para isso, pode ser necessário usar um diário persistente do systemd, conforme explicado acima.

Você verificou /var/log/syslogseu foolog?

solstício
fonte
Criei o /var/log/journalque você mencionou, mas não estou vendo o stdout do meu serviço systemd de qualquer maneira. no /var/log/syslogeu não vejo isso.
logoff