TCP(inetd、socatなど)によるawkの公開

TCP(inetd、socatなど)によるawkの公開

私はawkを使用しており、TCPソケットを介して公開したいと思います。

最初に試しましたが、micro inetdを使用すると失敗しました。私はキャリッジリターン/改行を処理する方法に問題があるかもしれないと考えてsocatに切り替えることにしました。

socatを介してリモートコマンドを使用することは非常に簡単です。

socat TCP4-LISTEN:9000 EXEC:/bin/cat
socat TCP4-LISTEN:9000 SYSTEM:"/bin/python -i"

これら二つの職業

しかし、単純なawkコマンド(たとえば、受信した行数を段階的に実行するために `awk '{print NR} '')を使用して同じ操作を試みるとき、同じシステム上の他のシェルでsocatと接続するときにどんな情報でも得られますお願いします。

私は多くのことを試しました(一部は構文エラーのため失敗しました。私には少しあいまいです。実際のコマンドの実行が委任されているため、strace socatを試しても正確に何が実行されているかを確認することはできませんでした。)

socat TCP4-LISTEN:9000 SYSTEM:"/usr/bin/awk '{print NR}'"
socat TCP4-LISTEN:9000 SYSTEM:'/usr/bin/awk "{print NR}"'
socat TCP4-LISTEN:9000 SYSTEM:'/usr/bin/awk "{print\ NR}"'

小さなスクリプトも作成しました。/tmp/testawk

#! /bin/sh
/usr/bin/awk '{print NR}'

(execバリエーションもあります)

#! /bin/sh
exec /usr/bin/awk '{print NR}'

どちらもローカルで動作しますが、電話するとき

socat TCP4-LISTEN:9000 EXEC:/tmp/testawk

出力を再送信しません。

私は問題がstdin / stdoutハンドルの継承および/またはcrlfの再処理である可能性があると思います。また、以下を試しました。

socat TCP4-LISTEN:9000 EXEC:/tmp/testawk,nofork
socat TCP4-LISTEN:9000,crnl EXEC:/tmp/testawk
socat TCP4-LISTEN:9000 EXEC:/tmp/testawk,crnl
socat TCP4-LISTEN:9000,crnl EXEC:/tmp/testawk,crnl

まだ文句を言う人がいることがわかりましたエマルジョンしかし、明らかにそれは何の関心を引き付けることができませんでした。

何が問題なのかご存知ですか?

ベストアンサー1

awkは、ターミナルを指すときにラインバッファリングされ、それ以外の場合は完全にバッファリングされるstdoutとして印刷されています。これは、バッファが満たされた後に出力を受け取る必要があることを意味します。つまり、4KBが印刷されました。

多くの出力を送信して(例:yesプログラムを使用)、これをテストできます。変更するには、次の手順を実行する必要があります。 - awkの標準出力をバッファリング解除します(例:https://unix.stackexchange.com/a/25375/63847) - 発信者の shutdown(2) システムコールを使用します (醜い)。

より良いソリューションを歓迎

おすすめ記事