NANDフラッシュがrootfsに組み込まれているデバイスがあります。ログファイルは通常退屈でフラッシュメモリを消費できないため、RAMに保存されます。しかし、デバイスがデバッグを必要とする障害状態に入る場合はほとんどありません。したがって、エラーが発生した場合は、/var/log/messages
シェルスクリプト(busybox bash)をNANDにコピーします。
今まではそんなに良くなった。残念ながら、1つのエラーが発生した場合、監視装置がシステムを再起動する前に数百または数千回の衝突が発生する可能性がある。可能な限り競合が発生したポイントに近いログファイルを調べたいのですが、ログファイル全体を何千回もコピーするのではなく、一度だけコピーしてから、新しいメッセージをそのファイルに追加したいと思います。
あなたは何をしますか?ラインカウンタを保存し、ファイルがすでに存在する場合にのみラインカウンタの後にラインを追加することを検討できますが(それからラインカウンタを更新する場合)、これを行うより賢い方法がありますか?
ベストアンサー1
tail -f
ファイルをコピーするのと同じエラー処理コードから、コピーされたログファイルに後続の行を追加するためにバックグラウンドプロセスを開始できませんか?それは次のとおりです。
tail -c +$(( $(wc -c COPIED_LOG | awk '{print $1}')+1 )) -f /var/log/messages >> COPIED_LOG
COPIED_LOG
複製されたログファイルが保存されるパスはどこにありますか?tail
見つかった - 番目のバイトから始まるように出力を指示します-c +N
。ここでは、コピーファイル()に既にあるバイト数に1を加えて、新しいコンテンツが開始されるバイトを取得します。次に、使用に追加します。N
/var/log/messages
wc -c COPIED_LOG | awk '{print $1}'
COPIED_LOG
>>
nohup ... &
バックグラウンドプロセスとして実行するには、ラッピングまたは同様のことを行う必要があります。また、あなたの質問ですでに述べたようにすでにCOPIED_LOG
存在していることを確認し、そうでない場合はこのバックグラウンドプロセスを実行してください。