まずスクリプトを作成し、socatを使用してUnixドメインソケットから読み込みます。

まずスクリプトを作成し、socatを使用してUnixドメインソケットから読み込みます。

私はUnixドメインソケットを受け取る単純なサーバーを持っています(CentOSシステムで)。 「DATE」コマンドをソケットに送信すると、ソケットはウェルカムメッセージを書き込み、「2015年4月15日」を書き込みます。次のコマンドを使用して、この操作を手動で実行できます。

socat - UNIX-CONNECT:/tmp/server.sock

しかし、今私はスクリプトを書きたいです。 echoの出力をパイプで接続してソケットにDATEコマンドを送信できますが、socatはウェルカムメッセージのみを返します。 socatが最初の2行だけを返すのか、それともソケットを閉じる前に静かな時間を待つのか、それとも何なのかわかりません。たとえば、

echo "DATE" | socat - UNIX-CONNECT:/tmp/server.sock

接続を切断する前にsocatに応答全体をキャプチャさせるにはどうすればよいですか? -tおよび-Tパラメータを使用して5秒待機しましたが、効果がなく、socatがすぐに返されます。

ベストアンサー1

存在する:

echo "DATE" | socat - UNIX-CONNECT:/tmp/server.sock

echo書き込みecho\nを終了し、パイプの書き込み終了を閉じます。

-これにより、アドレスの読み取り側にeofが表示されます。その後、socatUnixドメインソケットの「送信」側を閉じて、0.5秒間他の方向のソケットから何も出ない直後に終了します。

このオプションを使用すると、タイムアウトを0.5秒増やすことができます-t。だから:

echo DATE | socat -t 300 - UNIX-CONNECT:/tmp/server.sock

socat日付応答のために5分待つか、サーバーが接続の送信側を閉じます(そのうち最初に到着する基準)。

echoクライアントが送信者を閉じたときにサーバーがハングした場合、サーバーが切断されるまでクライアント(パイプの左側:)を実行し続けることができます(応答を送信した直後に接続を閉じると仮定)。次のようにできます。

sh -c 'echo "$$"; echo DATA; exec sleep infinity' | {
  IFS= read -r pid
  socat -t0 - UNIX-CONNECT:/tmp/server.sock
  kill -s PIPE "$pid" # terminate the client after the server shuts down
}

または:

echo DATE | socat -t0 -,ignoreeof UNIX-CONNECT:/tmp/server.sock

(使用するときはeofを無視し、1秒あたりignoreeofsocat詳細を読もうとします。パイプを使用するとeofの後に何も出ませんが、まだ私たちが望むものを提供します:まだ生きているクライアントをエミュレートします。)

または答えを見たらすぐに終了します。

sh -c 'echo "$$"; echo DATA; exec sleep infinity' | {
  IFS= read -r pid
  socat -t0 - UNIX-CONNECT:/tmp/server.sock | {
    IFS= read -r welcome
    IFS= read -r date
    printf '%s\n' "$date"
  }
  kill -s PIPE "$pid" # terminate the client after the reply has been read
}

おすすめ記事