A expansão de parâmetro do systemd está interferindo na própria sintaxe de linha de comando do meu serviço

0

Eu tenho este arquivo de unidade para executar um serviço no 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

Como você pode ver, estou definindo um formato de log em uma variável e passando isso na linha de comando para o programa. Isso não está funcionando.

Quando inicio o serviço, a linha de comando atual com a qual ele foi chamado se parece com isso:

   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...

Como você pode ver, o systemd expandiu %u , %t , %r e outros, antes de passá-los na linha de comando para o meu programa. Isso está errado e não o que é desejado.

Por que vale a pena, estou seguindo as instruções no link para configurar o verniz. Mas esse problema é o de fazer com que o daemon seja executado com os argumentos de linha de comando corretos, e não um na minha configuração de Varnish.

Eu estou tentando mudar o formato de log com o -F , a propósito, porque por padrão eu estou recebendo 127.0.0.1 em meus logs como o endereço IP do visitante, que é o endereço IP do nginix. Mas mais uma vez isso é incidental. Eu poderia querer usar sinais de porcentagem e variáveis em outros lugares na minha linha de comando.

Como posso especificar algo na linha de comando do programa em ExecStart e impedir que systemd faça sua própria expansão de parâmetro em qualquer coisa com sinais de porcentagem?

    
por Youlou 20.05.2015 / 18:58

1 resposta

4

A resposta é bem simples. Eu apenas "escapei" da parametrização dobrando os sinais de porcentagem:

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

A expansão dos parâmetros do systemd transforma %% em % , o que significa que meu programa vê %%u as %u e as coisas funcionam como eu quero.

Isso está na seção Especificadores da página de manual systemd.unit .

por 20.05.2015 / 21:56