systemd StandardOutput a un archivo _y_ al diario?

systemd StandardOutput a un archivo _y_ al diario?

Regularmente realizo un programa de procesamiento de datos de larga duración (~5 días). Estoy usando Ubuntu y ejecutando el comando con una tarea transitoria systemd a través de systemd-run --unit data_import /path/to/my-script.sh. Está funcionando bien. Puedo ver la salida estándar de registro del script con journalctl -u data_import.service.

Me gustaría que la salida estándar (& stderr) del script se guarde en un archivo, así como en el diario systemd. Veo que eso systemd-run --unit data_import -p "StandardOutput=file:/path/my-logging-file.txt …guardará la salida estándar en ese archivo. Sin embargo, no se registrará en el diario. Intenté proporcionar el argumento dos veces systemd-run -p "StandardOutput=file:/path/my-logging-file.txt" -p "StandardOutput=journal" …, pero no funcionó.

¿Es posible con systemd registrar la salida estándar en un archivo?yal diario systemd? (¿lo mismo ocurre con stderr?)

Ubuntu 18.04 y 20.04, systemd v250. o v245, etc.

Respuesta1

Supongo que no podemos dejar de encontrar una referencia.https://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=que podría ayudar (preste atención atoma uno decadena).

Controla a dónde está conectado el descriptor de archivo 1 (stdout) de los procesos ejecutados.toma uno deheredar, nulo, tty, diario, kmsg, diario+consola, kmsg+consola, archivo:ruta, agregar:ruta, truncar:ruta, socket o fd:nombre.

Aunque podemos cambiar el tipo de salida estándar predeterminado.

Respuesta2

¿Intentó crear un archivo de registro directamente en su secuencia de comandos y agregar la información cada vez que fuera necesario? Sé que es bastante obvio pero tengo curiosidad por ver si funciona.

Por ejemplo con bash, directamente en tu script:

# Declaration
LOG=/var/log/your_script_log.log
# Or with a date 
TODAY=$(date +%Y-%m-%d)
LOG=/var/log/your_script_log-$(TODAY).log
...
# Beginning of main script
echo -e $TODAY > $LOG
...
# Every time needed during the script
if [[ $state == *"stopped"* ]];then
    echo "A very important message." >> $LOG
...

Con un sistema como este necesitarás configurar un logrotate para evitar cientos de registros después de unos meses.

Respuesta3

@Amandasaurus Está bien, lo entiendo. Entonces te recomiendo que crees un archivo de servicio en "/etc/systemd/system/[El nombre de tu script].service" y agregues la información mínima necesaria:

[Unit]
Description=*The name of your script*

[Service]
ExecStart=/path/to/my-script.sh
ExecStop=/bin/kill $MAINPID
KillMode=process
Type=simple
StandardOutput=/path_to_log/service.log
StandardError=/path_to_log/service_error.log

[Install]
WantedBy=multi-user.target

Y luego configure un logrotate o agregue "agregar" al argumento StandardOutput. Después de eso haz lo siguiente:

systemctl daemon-reload
systemctl start *The name of your service*

Para habilitar el inicio al inicio de su servicio:

systemctl enable *The name of your service*

Fuente del argumento de registro en el archivo de servicio:aquí

información relacionada