Linux

使用 systemd 管道輸出到程序

  • April 7, 2017

這似乎應該很簡單,但我正在努力讓它發揮作用。我正在嘗試設置一個 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 仍然很新,或者其他這樣做的人更清楚他們在做什麼!

非常感謝任何幫助。

您已刪除該-D選項,因此程序將不再自行守護程序。您還刪除了-P將程序 ID 保存在文件中的選項。因此,您的單元不應繼續說它是分叉類型,也不應提供您未填寫的虛假 pid 文件。請嘗試Type=simple並刪除PIDFile=...ExecReload=...因為您的腳本不處理旋轉日誌文件。

引用自:https://unix.stackexchange.com/questions/356648