Atualmente, estou tentando criar uma unidade systemd como um servidor web. Atualmente, meu foo.service
arquivo 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 foo
executá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!
print('Hello World!', flush=True)
e isso fez o truque! A saída começou a aparecer no journalctl.Respostas:
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:
(para maiúsculas e minúsculas)
fonte
ExecStart=/my/foo/program
motivo pelo qual o log stdout não é liberado quando o serviço é finalizado, mas desaparece completamente.Por padrão no Ubuntu 15.04 , os diários do systemd são apenas voláteis, mantidos
/run/systemd/journal
e 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
stdout
saída é apenas redirecionadasyslog
e 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/syslog
seufoo
log?fonte
/var/log/journal
que você mencionou, mas não estou vendo o stdout do meu serviço systemd de qualquer maneira. no/var/log/syslog
eu não vejo isso.