使用 systemd 将输出管道传输到程序

使用 systemd 将输出管道传输到程序

这看起来应该很简单,但我正在努力使其发挥作用。我正在尝试设置一个 systemd 服务,以便从内存中输出日志条目的日志记录程序(varnishncsa)的输出可以通过管道传输到 cronolog。我能够使它工作的唯一方法是在前台。我正在尝试使其作为系统服务运行。接管前台的脚本是:

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

我正在尝试的 systemd 服务设置是:

[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

它基于提供的 systemd 服务,用于作为守护进程运行并写入文件(我无法使用 -D 和 -P 直接作为守护进程运行它,并通过管道传输输出):

[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

我尝试了很多选项来让它在后台运行,但无法让任何东西工作,并且在网上找不到任何专门处理这种情况的东西。可能是因为 systemd 还很新,或者其他这样做的人更了解他们在做什么!

非常感谢任何帮助。

答案1

您已删除该-D选项,因此程序将不再自行守护。您还删除了将-P进程 ID 保存在文件中的选项。因此,您的单位不应继续说它是分叉类型,也不应提供您未填写的虚假 pid 文件。请尝试Type=simple删除PIDFile=...ExecReload=...,因为您的脚本无法处理日志文件的轮换。

相关内容