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顺便说一句,我正在尝试使用 更改日志格式,因为默认情况下我在日志中获取 127.0.0.1 作为访问者 IP 地址,这是 nginx 的 IP 地址。但这又是偶然的。我可能想在命令行的其他地方使用百分号和变量。

如何在ExecStart和中的程序命令行上指定某些内容防止systemd 对任何带有百分号的东西进行自己的参数扩展?

答案1

答案其实很简单。我只是通过加倍百分号来“逃避”参数化:

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

systemd 的参数扩展变成%%%这意味着我的程序看起来%%u%u并且事情按照我想要的方式工作。

这是在说明符手册页的部分systemd.unit

相关内容