部屋を掃除したら漫画が沢山出てきたので書く日記

漫画とか合唱とかUNIXとかLinuxとかについて書く日記です。

topコマンド実行結果をファイル出力する

仕事でLinuxサーバのリソースを測定する事がありますが、プロセス毎のCPU使用率やメモリ使用率を取得するためにtopで測定を行っています。プロセス毎のリソース測定はpsでも可能ですが、CPU使用率の値が怪しく、topの方が信頼できそうなのです。SolarisLinuxでは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

これでスレッド表示もされないしエラーも出ません。さっそく今後の測定の時に使ってみよう。
ではー。