![Salida de tubería para programar con systemd](https://rvso.com/image/109228/Salida%20de%20tuber%C3%ADa%20para%20programar%20con%20systemd.png)
Parece que debería ser simple, pero estoy luchando para que funcione. Estoy intentando configurar un servicio systemd para que la salida de un programa de registro (varnishncsa) que genera entradas de registro desde la memoria pueda canalizarse a cronolog. La única forma en que he podido hacerlo funcionar es en primer plano. Estoy intentando que funcione como un servicio systemd. El guión que ocupa el primer plano es:
#!/bin/bash
/usr/bin/varnishncsa -F '%{X-Real-IP}i %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i"' -q "ReqHeader:Host ~ '(^|\.)example\.com$'" -C |/usr/sbin/cronolog "/example/varnish_access_log.%Y-%m-%d"
La configuración del servicio systemd que estoy intentando es:
[Unit]
Description=Example website Varnish Cache HTTP accelerator NCSA logging daemon
After=varnish.service
[Service]
RuntimeDirectory=varnishncsa
Type=forking
PIDFile=/run/varnishncsa/varnishncsa-example.pid
User=varnish
Group=varnish
ExecStart=/usr/local/bin/varnishncsa-example.sh
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
Que se basa en el servicio systemd proporcionado para ejecutar como demonio y escribir en un archivo (no puedo ejecutarlo directamente como demonio, usando -D y -P, y canalizar la salida):
[Unit]
Description=Varnish Cache HTTP accelerator NCSA logging daemon
After=varnish.service
[Service]
RuntimeDirectory=varnishncsa
Type=forking
PIDFile=/run/varnishncsa/varnishncsa.pid
User=varnish
Group=varnish
ExecStart=/usr/bin/varnishncsa -a -w /var/log/varnish/varnishncsa.log -D -P /run/varnishncsa/varnishncsa.pid
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
He probado muchas opciones para que se ejecute en segundo plano, pero no consigo que nada funcione y no encuentro nada en línea que se ocupe específicamente de esta situación. Probablemente porque systemd es todavía bastante nuevo, o porque otros que hacen esto tienen más idea de lo que están haciendo.
Cualquier ayuda es muy apreciada.
Respuesta1
Has eliminado la -D
opción para que el programa ya no se demonice. También eliminó la -P
opción de guardar la identificación del proceso en un archivo. Por lo tanto, su unidad no debe continuar diciendo que es un tipo de bifurcación y no debe generar un archivo pid falso que no esté completando. Pruebe Type=simple
en su lugar y elimine PIDFile=...
y, ExecReload=...
ya que su secuencia de comandos no maneja la rotación del archivo de registro.