タイムアウトコマンドとパイプ - 優先順位

タイムアウトコマンドとパイプ - 優先順位

TCPデータの受信をテストする必要があります。私許可されていませんiperfを使用してください。

要件は、誰かが任意のデータを送信するTCPサーバーを作成する必要があることです。受信したバイト数を計算する必要があります。

以下を使用するように指示されました。

timeout 60 cat < /dev/tcp/IP_addr/port | wc –c > byte_count-n.txt

これは彼らが考える効果をもたらすでしょうか? 60秒間データを受信して​​からタイムアウトが期限切れになったら、受信したデータをパイプしてwc合計をディスクファイルに書き込みますか?

プログラマーとしてこれを見るともっと嬉しかったです。

(timeout 60 cat < /dev/tcp/IP_addr/port) | wc –c > byte_count-n.txt

しかし、明らかにシェルはこれを受け入れません。私の懸念は正しいですか?

Ashシェルを使用していますが、Bashのみをサポートしているという懸念があります。/dev/tcp

ベストアンサー1

この回答を参照してください質問の以前のバージョンこのコマンドの元の意図は次のとおりです。仕える人

いいえbash(およびkshこの機能のソース)/dev/tcp/host/portは、次のためのものです。顧客TCP接続。

シェルはつながるホスト:ポートに接続し、その接続のソケットをリダイレクトトピックのfdに設定します。 orを使用する<<>fd 0(stdin)、を使用すると>fd >>1になりますが、演算子に違いはありません。<特にシェルを使用してもソケットの転送方向を閉じることはありません。 stdinはまだ読み書き可能なソケットに接続されています。

(サーバーとして)1つ以上の接続を受信して​​受け入れたい場合は使用できません/dev/tcp/host/port

組み込みツールなどの組み込みサポートを備えたシェルなどの専用socatツールを使用する必要があります。nczshztcp

timeout 60 socat -u tcp-listen:12345,reuseaddr,bind=127.0.0.1,fork - | wc -c

ループバックIPv4アドレスのポート12345をリッスンし、子プロセスから着信接続を受け入れて、リスンした内容をstdout(ここにパイプされますwc)に書き込みます。

ncnetcat同じタスクを実行するために一般的に使用できるツールのいくつかの実装があります。

timeout 60 nc -l 127.0.0.1 12345 | wc -c

60秒間コマンドを実行することに注意してください。これには、着信接続を待って何もしない時間が含まれます。

着信接続でタイマーを開始するには:

socat -u tcp-listen:12345,reuseaddr,bind=127.0.0.1 'EXEC:timeout 60 cat' | wc -c

ここでは、1つのTCP接続のみが許可され(no fork)にパイプされますtimeout 60 cat

このスレッドで質問する内容を明確にするには、次のようにします。

 cmd1 | cmd2

実行されずに完了するcmd1と、データはに転送され、同時に開始されます(並列に実行されます)。 2つの間にパイプがあります(cmd2のstdoutはパイプの書き込み終了です。cmd2のstdinは読み取り終了です)。cmd2cmd1cmd2cmd1

存在する:

 timeout 60 nc -l 127.0.0.1 12345 | wc -c

すでにtimeout並列実行中ですwctimeoutこれを実行する別のプロセスを開始しますnc(同じ標準出力を共有します)。

timeout60秒後、殺すその別のプロセス。この時点で終了しますが、ncソケットから受け取った内容をパイプに書き込みます(ncまたはsocat出力をバッファリングしません)。wcまだ読んでいなくても、wc読み続けるように扱われます。パイプが排水されます。

(timeout 60 nc ...) | wc –c

同じでしょう。(code)サブシェル(ksh93以外のシェルで評価されるサブシェルプロセス)を起動しますcode。ただし、ここではパイプラインの一部なので、コードはすでにサブシェルに存在する必要があります(パイプラインの異なる部分は同時に実行されるため、異なるプロセスで実行する必要があります)。

おすすめ記事