![systemd で出力をプログラムにパイプする](https://rvso.com/image/109228/systemd%20%E3%81%A7%E5%87%BA%E5%8A%9B%E3%82%92%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AB%E3%83%91%E3%82%A4%E3%83%97%E3%81%99%E3%82%8B.png)
これは簡単なように思えますが、うまく動作させるのに苦労しています。メモリからログエントリを出力するログプログラム (varnishncsa) からの出力を cronolog にパイプできるように、systemd サービスを設定しようとしています。これを動作させる唯一の方法は、フォアグラウンドで動作させることです。これを 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
プロセス ID をファイルに保存するオプションも削除しました。したがって、ユニットはフォーク タイプであるとは言わず、入力していない偽の pid ファイルを生成することはありません。代わりに、スクリプトがログ ファイルのローテーションを処理しないためType=simple
、 と を削除してみてPIDFile=...
ください。ExecReload=...