我正在尝试从 Debian 9 (haproxy 1.7.5-2) 中的 systemd 服务禁用 haproxy 前端。默认配置通过 /run/haproxy/admin.sock 处的 unix 套接字设置管理员访问权限,因此我使用 socat (1.7.3.1):
/bin/sh -c 'echo disable frontend http | /usr/bin/socat stdio unix-connect:/run/haproxy/admin.sock'
当我以 root 身份手动运行它时,效果非常好。如果我也省略生成一个新的 sh 实例,它也可以工作:
echo disable frontend http | /usr/bin/socat stdio unix-connect:/run/haproxy/admin.sock
当我尝试运行与 systemd 服务相同的命令时,我始终得到连接被拒绝错误,我不明白为什么。这是一个重现错误的简化服务文件:
[Unit]
Description=Test unit
After=network-online.target
[Service]
Type=oneshot
RemainAfterExit=false
ExecStartPre=/usr/bin/test -x /usr/bin/socat
ExecStart=/bin/sh -c 'echo disable frontend http | /usr/bin/socat stdio unix-connect:/run/haproxy/admin.sock'
相关错误来自systemctl status test.service
:
sh[1305]: 2020/05/09 12:26:23 socat[1308] E connect(5, AF=1 "/run/haproxy/admin.sock", 25): Connection refused
我验证了路径存在,并且可以完全按照中所写的方式运行命令执行启动systemd 失败后立即以 root 身份手动执行节。我以为我弄乱了 systemd 的语法,但这似乎不是问题。如果我使用 bash 或 zsh 而不是 /bin/sh 也会发生同样的错误。这几天来这让我抓狂。我缺少什么?
答案1
基于喵的评论,我给 socat 添加了重试选项:
ExecStart=/bin/sh -c 'echo disable frontend http | /usr/bin/socat stdio unix-connect:/run/haproxy/admin.sock,retry=2'
通过 systemd 启动仍然没有什么不同,但它现在可以工作。