数秒ごとにfreeコマンドでのみ使用されたメモリを取得します。

数秒ごとにfreeコマンドでのみ使用されたメモリを取得します。

たとえば、ここで説明します。

free -mコマンドで使用されている個々のメモリ情報を取得します。

freeコマンドの出力を切り取る方法。しかし、数秒ごとに実行してファイルに記録したいと思います。だから私は次のことを試みます:

free -g -s2 | sed -n 's/^Mem:\s\+[0-9]\+\s\+\([0-9]\+\)\s.\+/\1/p' >> memory2.log

しかし、ファイルはまだ空です。なぜこれが起こり、どのように解決するのですか?

答え1

これは、私が知っている限り、入力がsed最初にバッファリングされ、コマンドが終了しないために追加された部分(>>)に到達できないために発生します。この問題を解決するには-u/--unbufferedフラグを使用してくださいsed

free -g -s2 | sed -u -n 's/^Mem:\s\+[0-9]\+\s\+\([0-9]\+\)\s.\+/\1/p' >> memory2.log

別の解決策はwhileループを使用することです。

while true; do free -g | sed -n 's/^Mem:\s\+[0-9]\+\s\+\([0-9]\+\)\s.\+/\1/p'; sleep 1; done >> memory2.log

役に立ったことを願っています:)

答え2

より簡単なコマンドを書くには、awkを使いましょう。 Awkも出力バッファリングを使用しますが、mawk私のUbuntuデスクトップはラインバッファリングを使用するオプションをサポートしています。

free -g -s2 | awk -W interactive '/^Mem:/ {print $2}'

(注:マイコンピュータではawkDebian代替サブシステムを介して接続されています)mawk

シェルループ呼び出しを実行すると、free | awk次のようになります。非常に簡単なコマンド:

while true; do
  free -g | awk '/^Mem:/ {print $2}' >> /path/to/memory2.log
  sleep 2
done

関連情報