![Saída de canal para programa com systemd](https://rvso.com/image/109228/Sa%C3%ADda%20de%20canal%20para%20programa%20com%20systemd.png)
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 -D
opção para que o programa não se daemonize mais. Você também removeu a -P
opçã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=simple
remover PIDFile=...
e, ExecReload=...
já que seu script não consegue girar o arquivo de log.