私はこれを持っています:
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つの呼び出しの間に短い遅延を挿入するように変更し、クライアントをバックグラウンドジョブとして実行します(必ずしも必要ではありません)。