Linux
使用 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 仍然很新,或者其他這樣做的人更清楚他們在做什麼!
非常感謝任何幫助。
您已刪除該
-D
選項,因此程序將不再自行守護程序。您還刪除了-P
將程序 ID 保存在文件中的選項。因此,您的單元不應繼續說它是分叉類型,也不應提供您未填寫的虛假 pid 文件。請嘗試Type=simple
並刪除PIDFile=...
,ExecReload=...
因為您的腳本不處理旋轉日誌文件。