分割エラーが原因で定期的にクラッシュするコンピューティングクラスタでプログラムを実行しているので、詳細なデバッグ出力を維持して原因を診断したいと思います。ただし、プログラムは競合なしに複数時間実行される可能性があるため、出力全体をファイルにリダイレクトすると、ログファイルが大きすぎてsrun my-program-binary > output.log 2>&1
クラスタのディスククォータを超えてしまいます。最新のn行の出力(約1000行)だけが必要なので、実行中の出力バッファを維持し、将来の参照のために特定の時間の最新部分だけを維持する方法があるかどうか疑問に思います。
クラスターにインストールできる項目は限られているため、非標準パッケージを必要としないソリューションが必要です。このソリューション最後の部分を維持するためにファイルが生成されるのを待つことができないため、私の場合は機能しません。特定の長さ/メモリサイズを超えない実行バッファを維持する必要があります。このようなことをする方法を知っている人はいますか?
ベストアンサー1
bash
、wc
およびがある場合は、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をほとんど使用しません。