CPU/メモリの利用状態を全体、および各プロセスごとに確認する際に topコマンド を用いることがあると思います。今回は特定のプロセスについてtopコマンドで一定時間ごとにデータを入手したものをファイルに保存したいと思います。さらに、そのデータから特定の値のみ(CPU使用率だけなど)抽出するにはどうすればよいか紹介したいと思います。
topコマンドによって監視するプロセスはなんでもいいのですが今回はyesコマンドとします。
まず以下のようにyesコマンドをバックグラウンドで実行します。
yes > /dev/null &
出力を /dev/null
にリダイレクトしています。/dev/null
に送られたデータは全て破棄されます。
&
をつけることによりコマンドをバックグラウンドで実行できます。
ではtopコマンドの結果からyesコマンドによるプロセスの行のみを抽出したいと思います。
topコマンドはデフォルトで3秒ごとにデータを更新します。今回は-n 3
オプションにより3回分抽出してtop.txt
というファイルに保存してみましょう。
top -b -n 3 | grep --line-buffered yes > top.txt
topコマンドの結果から、名前にyes
という文字列の入るプロセスの行を抽出してファイルに保存しています。
ここでbオプション付けないと上手く動作してくれません。先頭にtopの結果以外の文字が混入してしまいます。
この理由は正直分かりませんでした...。キー操作による入力が勝手にまじっちゃうのかな? (有識者の方教えていただけると嬉しいです)
ポイントとしてはgrep
のオプションとして --line-buffered
を用いることです。
stackoverflowの解答を参考にしました。
デフォルトではgrep
はバッファのサイズを超えるまで出力をバッファリングします。そのためこのオプションを付けないとtop.txt
に何も書き込まれせん。これは実行環境によって異なるかもしれません。--line-buffered
オプションにより1行単位で出力させることができます。
それでは作成されたtop.txt
を見てみましょう。
14163 ユーザー名 20 0 9120 580 516 R 100.0 0.0 106:11.53 yes
14163 ユーザー名 20 0 9120 580 516 R 100.0 0.0 106:14.53 yes
14163 ユーザー名 20 0 9120 580 516 R 100.0 0.0 106:17.54 yes
yes
プロセスに対するtopコマンドの結果が3回分表示されていますね!
ユーザー名の箇所はyesコマンド実行ユーザが表示されていると思います。他にyesという文字列の入るプロセスが起動していれば、上記以外の行も出力されてしまいます。
それではこのファイルからCPU使用率のみ抽出したいと思います。CPU使用列は右から4項目目の値です。
ファイルから特定の列を抽出したい時にはcut
コマンドを用いると良いです。
抽出した結果をcpu.txtに保存したいと思います。
cut -c 50-54 top.txt > cpu.txt
cut
の-c 50-54
オプションにより、top.txt
の各行に対し50文字目から54文字目を抜き出します。CPU使用率の箇所が何文字目かは、エディタでファイルを開いた際にどこかにカーソルの位置が何文字目か表示されていると思いますので、そこから調べていただけると幸いです。
cpu.txt
の内容を確認すると
100.0
100.0
100.0
CPU使用率のみを抽出できていました!
目標達成です! この記事の需要があるかどうかわかりませんが、どなたかの役に立っていれば私も嬉しいです。
ここまで読んでいいただきありがとうございました!!