プロデューサは Unix ドメインソケットを介してコンシューマに接続されます。

プロデューサは Unix ドメインソケットを介してコンシューマに接続されます。

私はこれを持っています:

producer-client | consumer-server

コンシューマはUnixドメインソケット(類似)でリッスンするTCPサーバを起動し、クライアント(プロデューサ)はここに接続します。

しかし、明らかに競争条件があります。消費者が現れ、接続の受信を開始するのを待つ時間制限は約500msしかありません。私の質問は - 私が聞くことができるイベントはありますか?タイムアウト後に接続をポーリングしてテストできると思いました。そのUnixドメインソケットで何かが受信されていることを確認するためにポーリングするために使用できる同期ユーティリティはありますか?

アップデート#1

したがって、コンシューマはファイルを削除/リンク解除してから受信を開始します。プロデューサでファイルが存在しない場合はファイルを生成し、変更が発生した場合はリッスンするinotifyために使用します。変更してサーバーを知っています。消費者が今聞いています。

ベストアンサー1

producer-clientパイプではなくconsumer-serverソケットを介して通信している場合は、パイプで実行しないでください。

だから代わりに

consumer-server &
sleep 2
producer-client &

wait

その後、サーバーはバックグラウンドジョブで始まり、サーバーがすべてを初期化するまで2秒間待機し、クライアントもバックグラウンドジョブとして起動します。その後、スクリプトは両方とも終了するのを待ちます。

あなたが提案したように、クライアントはソケットファイルが表示されるのを待つかもしれません。ここでは使用されませんinotify

consumer-server &

while [ ! -S /path/to/socket ]; do
    echo Waiting for socket to appear... >&2
    sleep 1
done
producer-client &

wait

ループwhile(またはそれに対応するもの)は、内部的に実行される作業の一部でもありますproducer-client


サーバーとクライアントがパイプを介して通信しない場合、パイプは

producer-client | consumer-server

本質的に同じ

producer-client &
consumer-server

私が提案したコマンドセット(上記)は、2つの呼び出しの間に短い遅延を挿入するように変更し、クライアントをバックグラウンドジョブとして実行します(必ずしも必要ではありません)。

おすすめ記事