topコマンド実行結果をファイル出力する
仕事でLinuxサーバのリソースを測定する事がありますが、プロセス毎のCPU使用率やメモリ使用率を取得するためにtopで測定を行っています。プロセス毎のリソース測定はpsでも可能ですが、CPU使用率の値が怪しく、topの方が信頼できそうなのです。SolarisとLinuxではpsの結果が違うっぽい。
さて、topの実行結果は、これまで以下のようにbshスクリプト内で設定して取得していました。
top -d 1 -n 1 > hoge.txt 2>&1
この出力ファイルを整形してExcelでグラフにしたりするわけです。
しかしこのスクリプトを実行するとデータは取れるものの、
(standard_in) 1: parse error (standard_in) 1: parse error
というエラーが出力され気持ち悪い結果になっていました。
また、linuxカーネルによっては同梱されているtopの出力結果がスレッド毎になっている事があり、
mta
というプロセスのリソースが知りたいのに
26235 imaila 15 0 106M 103M 5268 S 0.0 2.5 0:00 2 mta 26236 imaila 15 0 106M 103M 5268 S 0.0 2.5 0:00 2 mta 26237 imaila 15 0 106M 103M 5268 S 0.0 2.5 0:00 1 mta 26238 imaila 15 0 106M 103M 5268 S 0.0 2.5 0:00 2 mta 26477 imaila 15 0 106M 103M 5268 S 0.0 2.5 0:00 0 mta 26478 imaila 15 0 106M 103M 5268 S 0.0 2.5 0:00 0 mta ・ ・ ・
というように大量のスレッド情報が出てしまい、測定に不向きでした。
そこで調べたところ、以下のようにすればスレッド情報をOFFに出来ることがわかりました。
■topを対話形式で実行
# top
実行中に「H」を入力すると、
「Show threads off」
という表示が出ます。
manには書いていなかったけど、top実行→「h」入力で表示されるヘルプに書いていました。わかり辛い・・・。
これでスレッド毎表示をOFFに出来ます。
しかしこれはあくまでも対話形式なので、上記で行っているコマンドライン形式では無効です。
そこで、設定ファイル「.toprc」を作成してみます。
■top実行中に「W」を入力
「Wrote configuration to /root/.toprc」
という表示が出ます。
ユーザのホームディレクトリを確認すると、.toprcというファイルが生成されていることがわかります。
# cd # ls -al .toprc -rw-r--r-- 1 root root 35 7月 16 09:56 .toprc
以降、top実行時はこのファイルに記載されている設定を反映して動作する事になります。付けたいオプションや対話形式用のコマンドも設定できるようです。
ただ、このWコマンドは動作が怪しいです。何回か試してみましたが生成されるファイルの中身がそのときによってまちまちです。
なので自分で設定した方が確実です。
■.toprcを編集
# vi .toprc 編集前は以下の通り。 AbcDgHIjklMnoTP|qrsuzyV{EFW[X 5IP 2行目を以下のように書き換え(Hトグルを追加) 5HIP 編集後は以下の通り。 AbcDgHIjklMnoTP|qrsuzyV{EFW[X 5HIP 保存終了 :wq
これで常にスレッド表示をOFFにできました。
次に(standard_in) 1: parse errorというエラー対策ですが、topには実は、出力結果をファイルに渡すためのバッチモードというのがあり、コマンドライン形式の時に-bを付ければよいとの事。これでエラーが出ないはずです。マニュアルちゃんと読まないとだめですねー。
よってまとめると、.toprcを作成した上でスクリプトには以下のように設定すればOKです。
top -d 1 -n 1 -b > hoge.txt 2>&1
これでスレッド表示もされないしエラーも出ません。さっそく今後の測定の時に使ってみよう。
ではー。