私は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が表示されます。その後、socat
Unixドメインソケットの「送信」側を閉じて、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秒あたりignoreeof
のsocat
詳細を読もうとします。パイプを使用すると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
}