3

シンプルなロガーが欲しい組み込みアプリケーションがあります。

システムはスクリプトファイルから起動し、スクリプトファイルがアプリケーションを実行します。スクリプトがアプリケーションの実行に失敗したり、アプリケーション自体が起動に失敗したりするさまざまな理由が考えられます。これをリモートで診断するには、スクリプトとアプリケーションからstdoutを表示する必要があります。

stdinからstdoutまでを繰り返すT字型のロガーを作成し、後でネットワーク経由で取得できるようにテキストをFIFOに保存してみました。それから私は素朴に試しました

./script | ./logger  

スクリプトstdoutだけがロガーに送られ、アプリケーションstdoutが消えてしまいました。ティーを試してみても同様の結果が得られました。

システムはカーネル2.4.26とbusyboxを実行しています。

何が起こっているのですか、そしてどうすれば私の希望する目的を達成できますか?

4

2 に答える 2

4

マイナーな落とし穴が1つあり、動作するはずだと思っていたとおりに動作していたことがわかりました。stdoutはバッファリングされていて、fflush(stdout)コマンドがないと、私はそれを見たことがありませんでした。もし私が本当に辛抱していたとしたら、stdoutバッファがいっぱいになったときに、突然大きな出力の急増が見られたでしょう。setlinebuf(3)を呼び出すと、問題が解決しました。

于 2012-10-03T04:49:09.543 に答える
0

どうやら、アプリケーションの出力はstdoutに終わらない...

  1. 出力は実際にはstderrにあります(通常は端末に接続されています)

       ./script.sh 2>&1 | ./logger
    

    その後、動作するはずです

  2. アプリケーションはstdin/stdoutからアクティブに切断します(たとえば、ファイル記述子0,1(、2)を閉じる/再度開くかnohupexecまたは同様のユーティリティを使用して)

  3. スクリプトはデーモン化します(これもすべての標準ストリームから切り離されます)

于 2012-09-27T23:54:38.297 に答える