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 deTTYPath=
, 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 deStandardInput=
. Esta configuración predeterminada es heredar.
¿Esto significa que estas son mis únicas opciones? Me gustaría, por ejemplo, poner salida /dev/shm
o 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.
/var/log/syslog
, pero /var/log/messages
hace 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 ...
StandardOutput=tty
para que puedas ver lo que sucede cuando ejecutas tu demonio? Debería emitir el terminal (puede que tenga que usar ttyS0
o similar para obtener el resultado en su pantalla).
ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
/var/log/syslog
salida? La mayoría de los sistemas iniciarán sesión,/var/log/
así que comenzaría por verificar allí. Puede usargrep
para buscar texto si conoce el resultado:grep "my output" /var/log
debería hacer el truco.