Actualmente estoy tratando de hacer una unidad systemd como servidor web. Actualmente, mi foo.service
archivo tiene el siguiente aspecto:
[Unit]
Description=The Foo Web Server
[Service]
Type=simple
ExecStart=/opt/foo/.cabal-sandbox/bin/foo
[Install]
WantedBy=multi-user.target
El foo
ejecutable registra automáticamente todas las solicitudes HTTP en stdout, esto está bien probado. Sin embargo, cuando veo los registros con journalctl -u foo
, solo obtengo 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...
¿Alguien podría explicar por qué no está registrando toda la salida estándar? Miré brevemente esta pregunta anterior , pero no ayuda, sin embargo, aludió a algo como "... puede que no funcione para sistemas que no usan systemd completo ", ¿sería este el caso de Ubuntu 15.04? ? Gracias de antemano, cualquier ayuda con esto sería muy apreciada.
print('Hello World!', flush=True)
eso y funcionó! La salida comenzó a aparecer en journalctl.Respuestas:
De hecho, el almacenamiento en búfer en UNIX depende del contexto: cuando stdout se redirige a algo interactivo como una consola, generalmente se almacena en línea, de lo contrario, está completamente protegido.
El almacenamiento en búfer se puede cambiar dentro de la aplicación mediante la llamada a la biblioteca setvbuf .
Pero también se puede hacer con el comando stdbuf en el lanzamiento:
(para caso de línea de búfer)
fuente
ExecStart=/my/foo/program
eso, por qué el registro stdout no se vacía cuando se termina el servicio, sino que desaparece por completo.De manera predeterminada en Ubuntu 15.04 , los diarios de systemd solo son volátiles y se mantienen
/run/systemd/journal
y se pierden en cada reinicio. Para usar el diario systemd persistente , debe crear el/var/log/journal
directorio (y reiniciar systemd-journald.service).Por lo tanto, es posible que la
stdout
salida se redirijasyslog
y no se mantenga en systemd journal. Para eso, es posible que deba usar un diario de systemd persistente como se explicó anteriormente.¿Has verificado
/var/log/syslog
tufoo
registro?fuente
/var/log/journal
como mencionaste, pero de todos modos no estoy viendo stdout de mi servicio systemd. en el/var/log/syslog
tampoco lo veo.