![使用 systemd 将输出管道传输到程序](https://linux22.com/image/109228/%E4%BD%BF%E7%94%A8%20systemd%20%E5%B0%86%E8%BE%93%E5%87%BA%E7%AE%A1%E9%81%93%E4%BC%A0%E8%BE%93%E5%88%B0%E7%A8%8B%E5%BA%8F.png)
这看起来应该很简单,但我正在努力使其发挥作用。我正在尝试设置一个 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=...
,因为您的脚本无法处理日志文件的轮换。