Timeout

超時命令和管道 - 優先順序

  • December 19, 2016

我需要測試 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.

您需要使用像socator這樣的專用工具nc,或者使用內置支持的 shell,就像zsh它的ztcp內置一樣。

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

這裡只接受一個 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

您已經獲得timeoutwc並行執行。timeout啟動另一個執行它的程序nc(它將共享相同的標準輸出)。

60 秒後,timeout殺死該其他程序。屆時nc將退出,但它會將它從套接字接收到的內容寫入管道(ncsocat不緩衝它們的輸出),因此即使wc尚未讀取它,它也會像wc繼續閱讀一樣被考慮在內直到管道為空。

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

會是一樣的。(code)是啟動一個子shell(一個子shell程序(在ksh93以外的shell中),它正在評估code)。但是在這裡,由於它是管道的一部分,因此該程式碼必須已經在子shell中(管道的不同部分必須在不同的程序中執行,因為它們同時執行)。

引用自:https://unix.stackexchange.com/questions/331362