超時命令和管道 - 優先順序
我需要測試 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 shell,但有些擔心只有 Bash 支持
/dev/tcp
請注意,這回答了命令應該是server的問題的早期版本。
No in
bash
(以及ksh
該功能的來源)/dev/tcp/host/port
是用於客戶端TCP 連接的虛擬文件。shell 將連接到 host:port,並使連接的套接字成為重定向主題的 fd。使用
<
or<>
,它是 fd 0 (stdin),使用>
,>>
它是 fd 1,但運算符沒有區別。特別是不是因為您使用<
了shell關閉了套接字的發送方向;stdin 仍將連接到您可以讀取和寫入的套接字。如果您想監聽(作為伺服器)並接受一個或多個連接,則不能使用
/dev/tcp/host/port
.您需要使用像
socat
or這樣的專用工具nc
,或者使用內置支持的 shell,就像zsh
它的ztcp
內置一樣。timeout 60 socat -u tcp-listen:12345,reuseaddr,bind=127.0.0.1,fork - | wc -c
將偵聽環回 IPv4 地址上的埠 12345 並接受子程序中的傳入連接,將接收到的內容寫入 stdout(此處通過管道傳輸到
wc
)。有幾種工具的實現,稱為
nc
或netcat
您通常可以使用它們來做同樣的事情: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
這裡只接受一個 TCP 連接(否
fork
),然後通過管道傳輸到timeout 60 cat
.只是為了澄清我認為您可能會在該主題中提出的問題,當您這樣做時:
cmd1 | cmd2
它沒有
cmd1
執行,完成後,數據被發送到cmd2
. 而是cmd1
同時cmd2
啟動(它們並行執行),它們之間有一個管道(cmd1
的 stdout 是管道的寫入端,而 cmd2 的 stdin 是讀取端)。在:
timeout 60 nc -l 127.0.0.1 12345 | wc -c
您已經獲得
timeout
併wc
並行執行。timeout
啟動另一個執行它的程序nc
(它將共享相同的標準輸出)。60 秒後,
timeout
將殺死該其他程序。屆時nc
將退出,但它會將它從套接字接收到的內容寫入管道(nc
或socat
不緩衝它們的輸出),因此即使wc
尚未讀取它,它也會像wc
繼續閱讀一樣被考慮在內直到管道為空。(timeout 60 nc ...) | wc –c
會是一樣的。
(code)
是啟動一個子shell(一個子shell程序(在ksh93以外的shell中),它正在評估code
)。但是在這裡,由於它是管道的一部分,因此該程式碼必須已經在子shell中(管道的不同部分必須在不同的程序中執行,因為它們同時執行)。