supervisord 配置文件中环境变量设置注意事项

in #cn3 days ago

最近在配置 supervisord 时遇到错误,原配置文件为:

[program:dbus]
command=/usr/bin/dbus-daemon --session --nofork --address=unix:path=/run/user/1001/bus
autostart=true
autorestart=true
user=lzc
environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus,XDG_RUNTIME_DIR=/run/user/1001

报错信息如下:

Error: Unexpected end of key/value pairs in value 'DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus,XDG_RUNTIME_DIR=/run/user/1001' in section 'program:dbus' (file: '/etc/supervisor/conf.d/dbus.conf')

这个错误是因为 supervisord 配置中 environment= 的语法要求很严格: 必须用逗号分隔的 key="value" 对,不能直接使用未加引号的字符串中带有 :/ 等特殊字符。

  • supervisord 把你写的环境变量值当作逗号分隔的多个键值对;
  • 它看到 unix:path=/run/user/1001/bus,以为这是 key=unix,后面再尝试解析 path=/run/user/1001/bus,结果失败;
  • 根本原因是值中含有逗号、冒号,没有加引号。
[program:dbus]
command=/usr/bin/dbus-daemon --session --nofork --address=unix:path=/run/user/1001/bus
user=lzc
autostart=true
autorestart=true
environment=DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1001/bus",XDG_RUNTIME_DIR="/run/user/1001"