![Передача вывода в программу с помощью systemd](https://rvso.com/image/109228/%D0%9F%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B0%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0%20%D0%B2%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%83%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20systemd.png)
Кажется, что это должно быть просто, но я борюсь, чтобы это работало. Я пытаюсь настроить службу systemd, чтобы вывод из программы ведения журнала (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"
Настройка службы 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
сохранения идентификатора процесса в файле. Поэтому ваш Unit не должен продолжать, говоря, что это тип разветвления, и не должен выдавать фиктивный файл pid, который вы не заполняете. Попробуйте Type=simple
вместо этого удалить PIDFile=...
и, ExecReload=...
поскольку ваш скрипт не обрабатывает ротацию файла журнала.