systemdのパラメータ拡張は、私のサービスの独自のコマンドライン構文を妨げます。

systemdのパラメータ拡張は、私のサービスの独自のコマンドライン構文を妨げます。

systemdでサービスを実行するための単位ファイルがあります。

[Unit]
Description=Varnish HTTP accelerator log daemon
After=varnish.service

[Service]
User=root
Environment="LOG_FORMAT='\"%{X-Forwarded-For}i\" %u %t \"%r\" %s %b \"%{Referer}i\ %{User-agent}i\"'"
ExecStart=/usr/bin/varnishncsa -a -w /var/log/www/www.my_website_varnish.log -q "ReqHeader ~ '^Host: www.my_website.fr'" -F $LOG_FORMAT
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

ご覧のとおり、変数にログ形式を定義してコマンドラインのプログラムに渡します。これはうまくいきません。

サービスを開始すると、サービスを呼び出す実際のコマンドラインは次のようになります。

   CGroup: /system.slice/varnishncsa.service
           └─60950 /usr/bin/varnishncsa -a -w /var/log/www/www.my_website_varnish.log -q ReqHeader ~ '^Host: www.my_website' -F "%{X-Forwarded-For}i" "root" /run "" /bin/sh ffd205c41b1e4c1088dac...

ご覧のとおり、systemdはコマンドラインを介して私のプログラムに渡す前に、および他の%uものを拡張しました%t%rこれは間違っており、人々が望むものではありません。

それは価値があるので、以下のガイドラインに従っています。https://wiki.deimos.fr/Nginx_%2B_Varnish_:_Cache_even_in_HTTPS_by_offloading_SSLニス設定用。しかし、問題はVarnish設定の問題ではなく、最初に正しいコマンドライン引数を使用してデーモンを実行することでした。

-Fところで、デフォルトでは、nginxのIPアドレスであるログの訪問者IPアドレスとして127.0.0.1が表示されるため、変更ログ形式を使用しようとします。しかしこれはまた偶然だった。コマンドラインの他の場所でパーセント記号と変数を使用したい場合があります。

ExecStartプログラムのコマンドラインで項目を指定する方法防ぐsystemdはパーセント記号付きのエントリに対して独自のパラメータ拡張を実行しますか?

答え1

答えは実際には非常に簡単です。パーセント記号を2倍にしてパラメータ化を「エスケープ」します。

Environment="LOG_FORMAT='\"%{X-Forwarded-For}i\" %%u %%t \"%%r\" %%s %%b \"%{Referer}i\ %{User-agent}i\"'"

systemdのパラメータ拡張はになります%%%これは私のプログラムが好きなように動作し、動作することを意味します%%u%u

この時間は指定子マニュアルページの一部systemd.unit

関連情報