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を介したブートはまだ違いはありませんが、今は機能します。

おすすめ記事