Linuxでこのコマンドを実行すると、次のようになります。
$ top -b -d 20 | grep "load average" -A 20 > top.log
top.log は常に空です。
しかし、このコマンドを実行すると:
$ top -b -d 20 | grep "load average" -A 20 | tee top.log
その後、top.logに内容があります。
これを使用したくない場合tee
(出力がコンソールに表示されたくないため)、top.logが更新されるように最初のコマンドを変更するにはどうすればよいですか?
マイコンピュータはCentOS Linux 7(コア)を使用しています。
答え1
--line-buffered
このオプションを使用する必要がありますgrep
(あなたの質問に「centos」タグが付けられているので、私は間違いなくGNU grepを使用しています)。
デフォルトではgrep
、ラインバッファリングは出力が端末のものである場合にのみ使用されます(stdio関数と同様にprintf、putsなど)。この--line-buffered
オプションはこれをオーバーライドします。 GNU coreutilsには、stdioを使用するすべての動的リンカーで動作するstdbuf(1)ラッパーもあります。
答え2
cat /proc/loadavg
間隔をあけて使用してください。なぜ取り出しますかtop
?これはアクティブモニタリング(主に)に使用され、常に読むよりも高速ですloadavg
。プロセスリストの場合はを使用し、ps
フラグ—sort
を使用してソートします。例えば
( while true ; do cat /proc/loadavg ; ps -aux | sort -nrk 3,3 | head -n 20 ; sleep 3 ; done ; ) | pipe ...
または
( while true ; do cat /proc/loadavg ; ps -Ao user,uid,pid,comm,pcpu,tty —sort=-pcpu —no-headers | head -n 20 ; sleep 3 ; done ; ) | pipe ...