이것은 간단해야 할 것 같지만 작동시키려고 애쓰고 있습니다. 메모리에서 로그 항목을 출력하는 로거(varnishncsa)의 출력이 cronolog로 파이프될 수 있도록 systemd 서비스를 설정하려고 합니다. 내가 작동하게 할 수 있는 유일한 방법은 전경에 있는 것입니다. 시스템 서비스로 실행하려고합니다. 프런트엔드를 담당하는 스크립트는 다음과 같습니다.
#!/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"
내가 시도하는 시스템 서비스 설정은 다음과 같습니다.
[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=...