Saída de canal para programa com systemd

Saída de canal para programa com systemd

Parece que deveria ser simples, mas estou lutando para fazer funcionar. Estou tentando configurar um serviço systemd para que a saída de um programa de log (varnishncsa) que gera entradas de log da memória possa ser canalizada para o cronolog. A única maneira de fazer isso funcionar é em primeiro plano. Estou tentando fazer com que funcione como um serviço systemd. O script que assume o primeiro plano é:

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

A configuração do serviço systemd que estou tentando é:

[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 é baseado no serviço systemd fornecido para execução como um daemon e gravação em um arquivo (não posso executá-lo diretamente como um daemon, usando -D e -P, e canalizar a saída):

[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

Eu tentei muitas opções para executá-lo em segundo plano, mas não consigo fazer nada funcionar e não consigo encontrar nada on-line que lide especificamente com essa situação. Provavelmente porque o systemd ainda é bastante novo, ou outros que fazem isso têm mais ideia do que estão fazendo!

Qualquer ajuda muito apreciada.

Responder1

Você removeu a -Dopção para que o programa não se daemonize mais. Você também removeu a -Popção de salvar o ID do processo em um arquivo. Portanto, sua unidade não deve continuar dizendo que é do tipo bifurcação e não deve fornecer um arquivo pid falso que você não está preenchendo. Em vez disso, tente Type=simpleremover PIDFile=...e, ExecReload=...já que seu script não consegue girar o arquivo de log.

informação relacionada