Before flagging the question as duplicate, please read my various issues I encountered.
A bit of background: we are developing a C++ application running on embedded ARM sbc using a lite variant of debian linux. The application start at boot launched by the boot script and print various information to stdout. What we would like is the ability to connect using SSH/Telnet and read the application output, without having to kill the process and restart it for the current bash session. I want to create a simple .sh script for non-tech-savvy people to use.
ここに投稿された同様の質問に対する最初の解決策は、 gdb を使用することです。まず、ユーザーフレンドリーではありません (複数のコマンドを手動で記述する必要があります)。その理由は不思議ですが、ファイルに何も出力されないようです。
2番目の解決策strace -ewrite -p PID
は完全に機能します。それが私が望んでいることです。問題は、標準出力以外にも多くの情報があり、フォーマットが適切でないことです。
「許容できる」結果を得ることができましたstrace -e write=1 -s 1024 -p 20049 2>&1 | grep "write(1,"
が、まだ余分なwrite(1, "...", 19) = 19
テキストがあります。この時点までは、文字列の書式設定だけですが、他の複数のページで、この行が適切な書式設定を実現していると述べています。strace -ff -e write=1,2 -s 1024 -p PID 2>&1 | grep "^ |" | cut -c11-60 | sed -e 's/ //g' | xxd -r -p
このコマンドには奇妙な点がいくつかあります (なぜ -ff?、なぜ grep "^ |"?、なぜそこで xxd を使用するのですか?) 試してみると、何も出力されません。
残念ながら、バグのある古いバージョンの busybox (1.7.1) を使用しているため、複数のパイプに問題があります。そのバグは私に悪い結果をもたらします。たとえば、grep のみを実行した場合は機能し、cut のみを実行した場合も機能しますが、"grep "write(1," | cut -c11-60" は何も返さないとします。
本当の解決策は単にbusyboxを更新し、これらの複数のパイプを使用して文字列をフォーマットすることであることは知っていますが、OSディストリビューションは世界中のクライアントに出荷された何千ものボードに既にインストールされているため、更新できません..
奇跡的な解決策を持っている人はいますか?ありがとう