Ausgabe mit systemd an Programm weiterleiten

Ausgabe mit systemd an Programm weiterleiten

Das scheint eigentlich ganz einfach zu sein, aber ich habe Mühe, es zum Laufen zu bringen. Ich versuche, einen systemd-Dienst so einzurichten, dass die Ausgabe eines Protokollierungsprogramms (varnishncsa), das Protokolleinträge aus dem Speicher ausgibt, an cronolog weitergeleitet werden kann. Ich habe es bisher nur im Vordergrund zum Laufen gebracht. Ich versuche, es als systemd-Dienst zum Laufen zu bringen. Das Skript, das den Vordergrund übernimmt, ist:

#!/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"

Das Systemd-Dienst-Setup, das ich versuche, ist:

[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

Dies basiert auf dem bereitgestellten systemd-Dienst zum Ausführen als Daemon und Schreiben in eine Datei (ich kann es nicht direkt als Daemon ausführen, indem ich -D und -P verwende und die Ausgabe weiterleite):

[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

Ich habe viele Möglichkeiten ausprobiert, um es im Hintergrund laufen zu lassen, aber nichts funktioniert und ich kann online nichts finden, das sich speziell mit dieser Situation befasst. Wahrscheinlich, weil systemd noch recht neu ist oder andere, die dies tun, besser wissen, was sie tun!

Für jede Hilfe bin ich sehr dankbar.

Antwort1

Sie haben die -DOption entfernt, damit das Programm sich nicht mehr selbst als Daemon ausgibt. Sie haben auch die -POption entfernt, die Prozess-ID in einer Datei zu speichern. Ihre Unit sollte also nicht fortfahren, anzugeben, dass es sich um einen Forking-Typ handelt, und keine falsche PID-Datei ausgeben, die Sie nicht ausfüllen. Versuchen Sie es Type=simplestattdessen und entfernen Sie PIDFile=...und, ExecReload=...da Ihr Skript die Rotation der Protokolldatei nicht handhabt.

verwandte Informationen