systemd en 15.04 no registrará la salida estándar de la unidad

12

Actualmente estoy tratando de hacer una unidad systemd como servidor web. Actualmente, mi foo.servicearchivo 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 fooejecutable 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.

Athan Clark
fuente
1
Asegúrese de que su proceso no esté almacenando la salida en el búfer. Tenía un problema similar y se resolvió deshabilitando el almacenamiento en búfer de salida de mi script de Python. Como el número de registros de registro producidos no era alto, parecía que no había registro, pero de hecho, todavía no tenía ninguna posibilidad, ya que todo se estaba acumulando en el búfer de salida estándar.
Jan Vlcinsky
1
Tratando de arreglar esto también. Tengo la impresión de que systemd hace buffering. stdout tiene un buffer de línea en UNIX, pero systemd hace lo suyo y almacena mucho más (para ser rápido pero inútil tal vez).
Velkan
Tuve el mismo problema y el problema fue el almacenamiento en búfer con la función de impresión de Python. Como estaba usando Python 3, ¡solo usé algo como print('Hello World!', flush=True)eso y funcionó! La salida comenzó a aparecer en journalctl.
timbram

Respuestas:

9

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:

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

(para caso de línea de búfer)

Velkan
fuente
Esto me salvó el día! Muchas gracias. Pero estoy un poco confundido con ExecStart=/my/foo/programeso, por qué el registro stdout no se vacía cuando se termina el servicio, sino que desaparece por completo.
wlnirvana
0

De manera predeterminada en Ubuntu 15.04 , los diarios de systemd solo son volátiles y se mantienen /run/systemd/journaly se pierden en cada reinicio. Para usar el diario systemd persistente , debe crear el /var/log/journaldirectorio (y reiniciar systemd-journald.service).

Por lo tanto, es posible que la stdoutsalida se redirija syslogy 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/syslogtu fooregistro?

solsticio
fuente
Creé el /var/log/journalcomo mencionaste, pero de todos modos no estoy viendo stdout de mi servicio systemd. en el /var/log/syslogtampoco lo veo.
cierre de sesión