systemd를 사용하여 haproxy 통계 소켓에 액세스할 수 없습니다.

systemd를 사용하여 haproxy 통계 소켓에 액세스할 수 없습니다.

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'

루트로 수동으로 실행하면 완벽하게 작동합니다. 새로운 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가 실패한 직후 루트로 해당 섹션을 수동으로 실행하십시오. 나는 systemd의 구문을 망쳤다고 생각했지만 그것은 문제가 아닌 것 같습니다. /bin/sh 대신 bash 또는 zsh를 사용하면 동일한 오류가 발생합니다. 요즘 이게 나를 미치게 만들고 있어요. 내가 무엇을 놓치고 있나요?

답변1

기반으로Meow님의 댓글, socat에 재시도 옵션을 추가했습니다.

ExecStart=/bin/sh -c 'echo disable frontend http | /usr/bin/socat stdio unix-connect:/run/haproxy/admin.sock,retry=2'

systemd를 통한 부팅은 여전히 ​​아무런 차이가 없지만 이제는 작동합니다.

관련 정보