Ver stdout / stderr del servicio systemd

175

He creado un archivo de servicio systemd simple para una aplicación personalizada. La aplicación funciona bien cuando la ejecuto manualmente, pero mi CPU se maximiza cuando la ejecuto con systemd.

Estoy tratando de rastrear dónde está mi problema, pero no sé dónde encontrar la salida (o cómo configurar systemd para colocar la salida en algún lugar).

Aquí está mi archivo de servicio:

[Unit]
Description=Syncs files with a server when they change
Wants=network.target
After=network.target

[Service]
ExecStart=/usr/local/bin/filesync-client --port 2500
WorkingDirectory=/usr/local/lib/node_modules/filesync-client
Restart=always

[Install]
WantedBy=multi-user.target

A lo largo de la aplicación, salgo a stdout y stderr.

¿Cómo puedo leer la salida de mi demonio?

Editar:

Encontré man systemd.exec, que mencionaba la StandardOutput=opción, pero no estoy seguro de cómo usarla. Desde la página del manual :

StandardOutput=

Controla dónde está conectado el descriptor de archivo 1 (STDOUT) de los procesos ejecutados. Toma uno de herencia , nulo , tty , syslog , kmsg , kmsg + consola , syslog + consola o socket .

Si se establece para heredar, el descriptor de archivo de entrada estándar se duplica para la salida estándar. Si se establece en nulo , se conectará la salida estándar /dev/null, es decir, todo lo escrito en él se perderá. Si se establece en tty , la salida estándar se conectará a un tty (como se configuró a través de TTYPath=, ver a continuación). Si el TTY se usa para la salida, solo el proceso ejecutado no se convertirá en el proceso de control del terminal y no fallará ni esperará a que otros procesos liberen el terminal. syslog conecta la salida estándar al registrador del sistema syslog (3). kmsg lo conecta con el búfer de registro del kernel al que se puede acceder a través de dmesg (1). syslog + console y kmsg + consolefunciona de manera similar, pero copia la salida a la consola del sistema también. socket conecta la salida estándar a un socket desde la activación del socket, la semántica es similar a la opción respectiva de StandardInput=. Esta configuración predeterminada es heredar.

¿Esto significa que estas son mis únicas opciones? Me gustaría, por ejemplo, poner salida /dev/shmo algo así. Supongo que podría usar un socket de dominio Unix y escribir un oyente simple, pero esto parece un poco innecesario.

Solo necesito esto para la depuración, y probablemente termine eliminando la mayoría de los registros y cambie la salida a syslog.

beatgammit
fuente
¿Has intentado comprobar la /var/log/syslogsalida? La mayoría de los sistemas iniciarán sesión, /var/log/así que comenzaría por verificar allí. Puede usar greppara buscar texto si conoce el resultado: grep "my output" /var/logdebería hacer el truco.
sbtkd85
@ sbtkd85 - Bueno, no tengo /var/log/syslog, pero /var/log/messageshace el truco. El problema es que, según los registros, mi daemon se bloquea al inicio, pero puedo decir que todavía se está ejecutando porque tiene un servidor HTTP, y puedo consultarlo. Parece que el resto de los registros se están perdiendo ...
beatgammit
¿Por qué no intentas configurarlo StandardOutput=ttypara que puedas ver lo que sucede cuando ejecutas tu demonio? Debería emitir el terminal (puede que tenga que usar ttyS0o similar para obtener el resultado en su pantalla).
sbtkd85
3
No deberían funcionar los operadores estándar de redirección de E / S en este contexto. Algo asíExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Deepak Mittal
¿Qué es realmente abusar de tu CPU? ¿Es systemd, su servicio o sistema (por ejemplo, generando nuevas copias del servicio porque systemd se volvió loco)?
Peter

Respuestas:

184

Actualizar

Como señala mikemaccana, el diario systemd es ahora el dispositivo de registro estándar para la mayoría de las distribuciones. Para ver el stdouty stderrde una unidad systemd, use el journalctlcomando

sudo journalctl -u [unit]

Respuesta original

Por defecto stdouty stderrde una unidad systemd se envían a syslog.

Si está utilizando el systemd completo, será accesible a través de journalctl. En Fedora, debería ser, /var/log/messagespero syslog lo colocará donde sus reglas lo dicen.

Debido a la fecha de la publicación, y suponiendo que la mayoría de las personas que están expuestas a systemd son a través de fedora, probablemente fue golpeado por el error descrito aquí: https://bugzilla.redhat.com/show_bug.cgi?id=754938 Tiene una buena explicación de cómo funciona todo =) (Esto fue un error en la política de selinux que causó que los mensajes de error no se registraran y se solucionó selinux-policy-3.10.0-58.fc16)

Mate
fuente
55
Tenga en cuenta que el uso del mecanismo de registro estándar como este no creará registros persistentes de forma predeterminada. Para hacerlo, deberá crear / var / log / journal, y luego ejecutarsudo systemctl restart systemd-journald
mlissner
1
¿Qué facilidad y prioridad de syslog?
jrwren
2
Esto funcionó para mí: StandardOutput=syslog+consoley StandardError=syslog+consoledespués de eso, todos los resultados de mi unidad aparecieron en journalctl. La configuración predeterminada era aparentemente incorrecta. (Como DefaultStandardOutput en /etc/systemd/system.conf)
gregn3
2
-fFue útil para mí. Seguí el registro a medida que se producían cambios (el caso de uso seguía al servidor de Minecraft que se ejecutaba como demonio)
blaughw
2
Esto me está volviendo loco ... En un estirado estándar, Debian Journalctl no me mostrará nada de la salida estándar. Incluso uso /usr/bin/stdbuf -oL <cmd>y un explícito StandardOutput=journal. Aún nada.
jlh
81

Respuesta más breve, simple y no heredada:

sudo journalctl -u [unitfile]

Donde [unitfile] es el .servicenombre del sistema. Por ejemplo, para ver mensajes de myapp.service,

sudo journalctl --unit=myapp

Para seguir registros en tiempo real:

sudo journalctl -f -u myapp
mikemaccana
fuente
44
Tenga en cuenta que es posible que deba hacerlo sudosi obtiene un No journal files founderror.
bigjosh
55
syslog no es legado ...
Miles Rout
2
Está en las distribuciones actuales de Linux. Puede que realmente te guste syslog, pero eso no cambia lo que envían.
mikemaccana
1
Seguro. Y también usa syslog. Mi punto no fue que systemd no se usa, sino que syslog no es heredado.
laberinto
66
@JECompton si todo el registro en las distribuciones de Linux actuales usa journald, y syslog no es necesario y solo se usa por compatibilidad, entonces lógicamente se deduce que syslog es heredado.
mikemaccana