少数の非常に簡単なコマンドを処理するために要求/応答TCPサーバーを作成しようとしています。私は可能な限り移植性を高め、コンパイルやプログラミング言語のための特定のランタイムの必要性を避けるためにシェルスクリプトを使用します。
私はコマンドの結果を話すクライアントに応答したいと思います。これは、応答が動的でなければならないことを意味します。
現在、以下を使用しようとしていますnc
。
mkfifo commands
mkfifo nc_responses
nc -k -l 47201 >commands < <(tail -f nc_responses) &
while read -r command; do
echo "Got $command"
echo "Ran $command" >nc_responses
done <commands
これは2番目のシェルから呼び出された結果です。
$ nc localhost 47201 <<< 'command 1'
$ nc localhost 47201 <<< 'command 2'
Ran command 1
$ nc localhost 47201 <<< 'command 3'
Ran command 2
$ nc localhost 47201 <<< 'command 4'
Ran command 3
ご覧のとおり、応答はリクエスト 1 よりも遅れます。
リクエストで応答が動的に生成されるように、この問題に対する解決策を見つけることができる人はいますか?
(コンテキスト - これは組み込みでbash
onを使用しています)macOS
macOS
nc
ベストアンサー1
このアドバイスを他の場所でも繰り返してください。 https://superuser.com/a/998731
サーバーではなくクライアントに問題があるようです。
nc localhost 47201 <<< 'command 1'`
応答が渡されるほど長い間接続が開かれていませんでした。
これは働きます:
{ echo 'command 1'; sleep 0.1; } | nc localhost 47201
睡眠を使うのはひどい感じですが!クライアントが既知のエンドポイントからの応答を待つ(タイムアウト?)より良い方法があるかどうか疑問に思います。
EOFは接続ごとに新しい入力パイプを開くことができないため、作業が簡単ではありません。