topコマンドを手練のエンジニアっぽく使ってみる
目次
こんにちは。
開発チームのワイルド担当、まんだいです。
所謂ハッカーと呼ばれる人たちが、様々な監視やブロックをかいくぐってサーバーにログインした際、最初に叩くコマンドは「w」コマンドだと言われていますが、サーバー管理者が異常を検知した際に最初に叩くコマンドは、「ps」コマンドか、「top」コマンドではないでしょうか。
今回は、ちょっと真面目に、人と差が付くtopコマンドの使い方を紹介します。
始める前に
topコマンドを実行すると、システム全体のリソースが表示される上段のサマリーエリアと、実行されているプロセスが表示されている下段のタスクエリアの2つに分かれています。
これから紹介する機能は、このいずれかに作用するものが多く、説明の中で使っていきますので覚えておいてください。
topコマンドの叩き方
いきなりですが、sshでログインしたあと、若干前のめり気味に「top」とするのは、少々素人臭いやり方ではないでしょうか。
topコマンドには、他のコマンド同様引数を設定できるので、これを利用しない手はありません。
どんな引数が必要か、ログインしている間に考える余裕は持てる方がいいですね。
例えば、実行中のコマンドを完全な形で表示するには
top -c
とします。
また、デフォルト3秒の画面更新を変更する場合は
top -d 0.5 # 画面更新を0.5秒おきに行う
とします。
上記の2つを同時に発行するには
top -c -d 0.5 # もしくは top -cd 0.5 # 以下はあかんやつ top -dc 0.5
とします。
画面更新のタイミングを早くしすぎると、思いの外負荷が上がるので、程々にしましょう。
実行中にできること
サマリーエリアの表示切り替え
サマリーエリアは、大きく分けて3つの内容に分かれます。
- 赤枠で囲った、uptime(起動時間)と全体的な負荷の情報(l)
- 緑枠で囲った、CPUとタスクの情報(t)
- 青枠で囲った、メモリとスワップの情報(m)
これらに対応したキー(かっこ内のキー)を押す事で、表示/非表示が可能です。
あと、重要なキーとして、「1」があり、このキーを押すと、CPUがマルチコアの場合、それぞれのコアの負荷が個別に表示されるようになります。
タスクエリアの表示切り替え
デフォルトのtop画面でも、現在のシステムの負荷状況は把握できますが、表示されていない項目が多数あるのも事実です。
top実行中に、「f」を押すと、topが表示できる項目の一覧が表示され、表示/非表示の設定ができます。
この画面では、上下でカーソルが移動できるので、表示したい項目へカーソルを移動させ、「d」もしくは、スペースキーで太文字にすると、その項目が表示されます。
意外に取得が面倒なスワップの使用量も、top画面で取得する事ができます。
更に、上下で移動させた後、右を押すと、項目全体が選択状態になり、その状態で上下させると、項目の表示順を調整する事ができます。
以下の動画は、スワップ使用量を表示させ、コマンドの手前に持ってきた様子を撮影したものです。
シグナル送信
シグナルとはなんぞやと思われる方は、wikipediaなどを確認していただくとして、よくあるシグナルの送信は、プロセスのkillですね。
「kill [pid]」相当の事は、top上で実行可能です。
やり方は、top実行中に「k」を押します。この時点で間違って押した場合は、エスケープキーで脱出可能です。
タスクエリアの上に、「PID to signal/kill」という表示が出るので、killしたいプロセスIDを入力します。
続いて、「Send pid [PID] signal [15/sigterm]」という表示が出るので、送りたいシグナル名/シグナル番号を送信します。
デフォルトでは、sigterm(15)を送信するので、これで落ちないプロセスの場合は、sigkill(9)を送ってみます。
top画面を見ながらプロセスのkillができるのでオススメです。
玄人向けの分割ウィンドウモード(alternate-display mode)
どういう訳かはわかりませんが、topには、画面を最大4分割して実行中のプロセスを見る、(alternate-display mode)が搭載されています。
分割モード(とここでは呼びます。man topの翻訳版では、別形式の表示モードと呼ばれています)と通常のフルスクリーンモードの切り替えは「Shift + a」で行います。
分割モードに突入した瞬間の画面構成は以下のようになっています。
いつものtopじゃない! バグった訳ではありません。
イメージとしては、タスクエリアが4種類まで保持できるような状態で、表示したい項目に合わせてフィールドを調整し、切り替えるという形です。
デフォルトは1の画面で、他の画面へ移動するには、「a」で順方向移動、「w」で逆方向移動になります。
また、特定のページへ移動する場合は、「g」を押してから数字の1~4を押すという形になりますが、4枚しかないので、敢えて使うこともないかも知れません。
画面を移動したら、「Shift + a」でフルスクリーンモードに戻ります。
すると、タスクエリアの表示形式が変わり、画面いっぱいプロセスが表示されます。
この各画面に対して、「f」でフィールドの調整、ソート対象のフィールド指定ができるので、調整するという形になります。
分割モードで調整したものは、そのまま終了してしまうと、元の状態に戻ってしまうので、この後に書いてある、設定ファイルを出力しておくと次回以降も反映された状態で起動します。
起動時の出力状態を事前に定義する
異常を検知してtopを確認する場合、時間との勝負になる事はよくありますので、引数を毎回付けて実行するのは時間のロスだと考える事もできます。
その場合は、設定ファイルに書き込んでしまうというのも一つの手だと思います。
表示状態を定義する設定ファイルは、各ユーザーの「$HOME/.toprc」というファイルに通常出力されます。
設定方法は簡単で、topで自分好みの表示を設定した後、「W」を押して終了するだけです。
大文字のWなので、Caps Lockを切っている場合は「Shift + w」で入力します。
出来上がったファイルは、以下のようになっています。
top's Config File (Linux processes with windows) Id:i, Mode_altscr=0, Mode_irixps=1, Delay_time=3.0, Curwin=0 2 fieldscur=¥¨³´»½ÀÄ·º¹Å&')*+,-./012568<>?ABCFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij winflags=193844, sortindx=18, maxtasks=0, graph_cpus=0, graph_mems=0 summclr=1, msgsclr=1, headclr=3, taskclr=1 Job fieldscur=¥¦¹·º(³´Ä»½@<§Å)*+,-./012568>?ABCFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij winflags=161076, sortindx=0, maxtasks=0, graph_cpus=0, graph_mems=0 summclr=6, msgsclr=6, headclr=7, taskclr=6 1 fieldscur=¥º»<½¾¿ÀÁMBNÃD34·Å&'()*+,-./0125689FGHIJKLOPQRSTUVWXYZ[\]^_`abcdefghij winflags=193844, sortindx=21, maxtasks=0, graph_cpus=0, graph_mems=0 summclr=5, msgsclr=5, headclr=4, taskclr=5 Usr fieldscur=¥¦§¨ª°¹·ºÄÅ)+,-./1234568;<=>?@ABCFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij winflags=193844, sortindx=3, maxtasks=0, graph_cpus=0, graph_mems=0 summclr=3, msgsclr=3, headclr=2, taskclr=3 Fixed_widest=0, Summ_mscale=0, Task_mscale=0, Zero_suppress=0
正直この状態では、何が何やらさっぱり分からない(一つずつ確認して見れば読めなくはない)ので、このファイルは手動で作るのはやめたほうがよいと思います。
逆に言うと、うまく設定されたファイルは、コピペするだけで他のマシンにも適用する事ができるので、chefやansibleを使って構築する場合でも、簡単に反映することができます。
topコマンドの設定ファイルを複数用意する
top画面の設定に凝りだすと、複数の画面設定を用意して、状況に合わせてそれらを使いたくなる事でしょう。
ただ、topの設定ファイルは、先にも書いた「$HOME/.toprc」になっています。
実は、これは正しい説明ではありませんでした。
正しくは、「$HOME/.[topの名前]rc」が正しいものになります。
topの名前がどういう事かというのを実験してみました。
# 現在のtopのパスを確認 $ which top /usr/bin/top # /usr/bin/topへのシンボリックリンクを/usr/bin/mytopに作成 $ sudo ln -s /usr/bin/top /usr/bin/mytop # 実行してみる $ mytop
これは正しく実行し、通常通りtopが開きます。
ここで、フィールドや表示を変更して保存してみると、「$HOME/.mytoprc」というファイルが作成されます。
このように、シンボリックリンクを作成して、設定ファイルの書き分けができるという事になります。
自分専用にカスタマイズしたtopを、別名で実行する形になるので、普通のtopに影響を与える事はなくなります。
バッチモードで起動する
topがリアルタイムにシステムの状態を画面上に表示するだけのツールと思っているのは大きな間違いで、vmstatやsarコマンドのように、出力結果を標準出力へ流し、加工したり、保存するためのバッチモードも搭載しています。
以下のコマンドは、topの結果を標準出力に流すコマンドになります。
top -b -n 5 -d 0.5
「-b」オプションで、バッチモードで起動し、「-n」で表示回数を指定します。
更に、「-d」オプションで、表示の間隔を指定します。
この場合では、0.5秒間隔で5回のtop画面の結果を標準出力に流す事になります。
勿論、パイプで繋いで、他のコマンドに流す事もできますが、以下のコマンドは、多くの場合誤りです。
top -b -n 5 -d 0.5 | head -n 5
実行してみると、どういう意味かよく分かると思います。
コマンドを見ると、どういう結果を欲しているかは想像できると思いますが、この場合の用途として、topコマンドは不向きだという事です。
まとめ
topコマンドはいろんな状況で役に立つ便利なコマンドですが、カスタマイズする事によって、さらに便利になるという事が分かっていただけたでしょうか?
全容はこんな感じですが、カスタマイズの方針によって、いくらでも凝った作りにする事ができるのが面白いですね。
こんな感じで、24時間365日サーバーの監視を行っております。
以上です。