そうだhping
はい完全にバッファリングperl
パイプラインを介して行ごとに追加処理を実行するときPerlでパイプを接続する動作しません。
hping --icmp-ts example.ca | perl -ne 'if (/Originate=(\d+) Receive=(\d+) Transmit=(\d+)/) { ($o, $r, $t) = ($1, $2, $3); } if (/tsrtt=(\d+)/) { print $r - $o, " ", $o + $1 - $t, "\n"; }'
hpingを次に変更する方法完全にバッファリング存在するラインバッファいつパイプで接続されますか?
OpenBSDベースではソリューションが機能しないため、次の質問と重複しません。
答え1
持つ2つの一般的なソリューション、stdbuf
そしてunbuffer
。
stdbuf
GNU coreutilsからのこの機能は2009年バージョン7.5に追加されたため、CentOS 5を除く現在のすべての非組み込みLinuxシステムに適用されました。バージョン8.4以降、FreeBSDにもあります。私が知っている限り、他のUNIXバリアントはそれを採用していません。特にOpenBSD 5.4ではさらにそうです。
unbuffer
は予想されるスクリプトは、ほとんどすべてのUNIXを含むどこでも使用できます。 Expectを使用できます。すべてのBSDバリアントはexpert
ポートコレクションのパッケージに含まれています。
expect
パッケージをインストールして実行します。unbuffer hping … | perl …
答え2
別のオプションは、次のものを使用することですsocat
。
# cf. http://unix.stackexchange.com/a/25377
socat EXEC:'hping --icmp-ts example.ca',pty,ctty STDIO | perl -ne 'if ...