ファイルに最新のn行の出力のみを保持します。

ファイルに最新のn行の出力のみを保持します。

分割エラーが原因で定期的にクラッシュするコンピューティングクラスタでプログラムを実行しているので、詳細なデバッグ出力を維持して原因を診断したいと思います。ただし、プログラムは競合なしに複数時間実行される可能性があるため、出力全体をファイルにリダイレクトすると、ログファイルが大きすぎてsrun my-program-binary > output.log 2>&1クラスタのディスククォータを超えてしまいます。最新のn行の出力(約1000行)だけが必要なので、実行中の出力バッファを維持し、将来の参照のために特定の時間の最新部分だけを維持する方法があるかどうか疑問に思います。

クラスターにインストールできる項目は限られているため、非標準パッケージを必要としないソリューションが必要です。このソリューション最後の部分を維持するためにファイルが生成されるのを待つことができないため、私の場合は機能しません。特定の長さ/メモリサイズを超えない実行バッファを維持する必要があります。このようなことをする方法を知っている人はいますか?

ベストアンサー1

bashwcおよびがある場合は、sed小さなスクリプトを使用できます。

#!/bin/bash

file=$1
nlines=$2

while read line ; do
    echo "$line" >> $file
    read clines _ <<< $(wc -l $file)
    if [[ clines -gt nlines ]] ; then
        n=$(( clines - nlines ))
        sed -i -e 1,${n}d $file
    fi
done

パイプで使用:srun my-program-binary 2>&1 | a_little_script output.log 1000

スクリプトは

  • 出力の各行を読み取り、my-program-binaryそれをoutput.logにエコーします。
  • Output.log の現在の行数を取得します。
  • それ以降の最初のn行を削除nlines

これにより、出力の最後のn行が常にログファイルに保持されます。メモリとCPUをほとんど使用しません。

おすすめ記事