helloworlds

not a noun, it's a verb

【インフラ】気になるLinuxコマンド!

今回はLinuxのコマンドについて色々調べてみました。

自分の場合、仕事でもプライベートでもだいたい同じコマンドを使っていますが、 作業中に「もっと便利にならないかな?」とか効率化を求めます。

が、その時は思っていてもすぐ忘れていて、新しいコマンドを一時的にしか覚えられない....

ということで、サーバーサイド、インフラエンジニアがよく使うコマンド!みたいなかんじで調べてまとめようかと思います。 (完全あとで見直す用になりそうw そして、随時更新していきます ############)

コマンドって一体どれくらいあるの??

一度は考えてしまうと思いますw 一体この世の中には何種類のコマンドが存在するのか?

この疑問を解決するには、まず種類分けをしなければならなそうです。 例えば、UNIX系なのか、とかとか... ちょっと調べましたが中々統計データは出てこなかったのでわかりませんでした。

これはLinuxで使用されるコマンド集。

fossbytes.com

これだけでも膨大な量ですねw また、AWScliとかWindowsコマンドとかたくさんあるので、調べようがない... 日本人の方でコマンド集を随時更新されている方がいましたが、そこではコマンドの種類問わず、約500のコマンドが記載されていました。

なので、ここでは主にLinuxで用意されているコマンドをみていきます。

また、"どうしてコマンドが使用できるのか"など、その仕組については割愛します。 以下の記事がわかりやすいので、載せておきます。

シェルの概念と機能

もしなんの種類のシェルを使用しているのかわからない方は以下を実行してみましょう!

$ echo $SHELL

基礎

ps

Linux上で動作しているプロセス (process)を確認するコマンド。 コマンドの話ではないですが、私なんかは自宅のWindowsデスクトップを使用しているとき、 セカンドディスプレイで必ずタスクマネージャーを表示させています。 GUIがなくてももちろんプロセスは確認しないといけませんね!

これでプロセスを確認。(オプションなしでも使用できる)

$ ps
$ ps auxwwf 
$ ps rlu
$ ps auxwwrlue
オプション 内容
-A 全プロセスを表示する。
a 端末操作のプロセスを表示
x 端末操作以外のプロセスを表示
r 現在、実行しているプロセスを表示
c 実行しているコマンド名を表示
e 実行しているコマンド名と環境変数を表示
u CPUやメモリの使用率なども表示
h 項目名を表示しない
l プロセスの状態なども表示
f プロセスを階層で表示
o 指定したリスト順の出力形式で表示
-C 実行しているプロセスやプログラムのファイル名を指定
-u プロセスを実行しているユーザーを指定
-g プロセスを実行しているグループを指定
-p 実行しているプロセスのプロセス番号(PID)を指定
--sort プロセスの表示順を指定
w 出力時の幅を広げる

よく使用されるオプションとして、fがあるようだけど、なんとmacでは使用できない。 オプションfは、プロセスを階層で表示するためのオプション。 そのかわりに、pstree コマンドが使用できるようです。

$ brew install pstree
$ pstree

pstreeをオプションなしで実行すると、ものすごい勢いでツリーが表示されてしまいますw なので、パイプをあわせて使用したほうが良さそうです。

$ pstree | grep root

どうしてツリー表示がいいかというと、子プロセスをkillしても問題が解決しない場合があって、親のプロセスをおう必要があるからです。

psコマンドはここまでにして、リアルタイムでプロセスを確認する手段もあります。

top

topコマンドは、実行中プロセスの情報をリアルタイムで確認できるコマンドです。

オプションなしで実行できます。

$ top
$ top -u <user_name> # ユーザーを指定
$ top -p <process_id> # プロセスIDはを指定
$ top -d 1 # 表示間隔を1秒にする

少しだけ覚えることがあります。 プロセスが表示されている時に操作することができるので、その操作を知っておくと便利かもしれません。

キー 内容
k 指定したPIDを終了する
r 指定したPIDのNIを変更する
l, t, m 画面上部に表示されている情報の表示/非表示を切り替え
z 画面上の文字に色をつけて強調表示
Shift+V プロセスの一覧をツリー状に表示
Shift+P プロセスの一覧をCPUの使用率が高い順に並べ替え
Shift+M プロセスの一覧をメモリの使用率が高い順に並べ替え
Shift+T プロセスの一覧を稼働時間が長い順に並べ替え

NI(ナイス値)とは、プロセスの優先度を示す数値のこと。-20〜+20で、-20が最も高い優先度になる。

macの場合操作がうまくいかないことがありました。 その場合は(例: CPU使用率順)、top -o cpuでtopコマンドを実行するか、 起動後、o > cpu > Enterでソートできました。 ちなみに、AmazonLinuxでは上記の表で操作できました。

あくまで私の場合ですが、macbook Pro(Core i7, メモリ16GB)で随時起動させていて、他のアプリが重くなるなどの事象は起きないくらいです。 そして、気づいたですが、表示されているプロセスの件数は、画面の大きさに依存するようです。スクロールできないので、たくさん表示させる必要がある場合はウィンドウを広げたほうが良さそうです。

vmstat (vm_stat)

topコマンドがあるのに、vmstatを使用する場合とはどういうことなのでしょうか。 vmstatは、主に仮想メモリやCPU、ディスクI/Oの情報などを確認します。私の理解が正しければ、I/Oに注目すると良いかもしれません。

このコマンドはオプションの使用で、最短1秒での情報を随時確認できます。

$ vmstat
$ vmstat 1       # 1秒間隔で表示 (1行目は、最後に起動した時からvmstatコマンド実行開始までの統計情報を表示)
$ vmstat 1 10  # 1秒間隔で10回表示 
# 出力例

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 1015184 695248 754740    0    0     0   206    0    1  8  2 90  0  0   
 0  0      0 1015292 695248 754740    0    0     0     0   48   44  0  0 100  0  0  
 0  0      0 1015292 695248 754740    0    0     0     0   31   38  0  0 100  0  0  
内容
procs r 実行中と実行待ち中のプロセス数合計
b 割り込み不可能なsleep状態にあるプロセス数
memory swpd 使用中の仮想メモリの量
free 空きメモリの量
buff バッファとして使用しているメモリの量
cache cacheに使用している量
inact アクティブではないメモリの量
active アクティブなメモリの量
swap si ディスクからスワップインしているメモリの量
so スワップアウトしている量
io bi HDDのようなブロック型デバイスから受け取ったブロック数
bo ブロック型デバイスに送ったブロック数
system in 1秒当たりの割り込み回数
cs コンテクストスイッチの回数
cpu us カーネルコード以外の実行に使用した時間(プログラムが動いていた時間)
sy カーネルコードの実行に使用した時間
id 空転していたアイドル時間
wa I/O待ち時間
st ゲストOSがリソース要求を行い、CPUリソースを割り当てがなかった時間の割合

r(実行中/実行待ち)の値がずーっとある場合処理が追いついていないなどが考えられる。 それと同時にswapのsi/soも確認する。できるだけここの値は0になることが好ましい。

このコマンドも運用で頻繁に使用していることが好ましいかもしれない。項目をみれば理解できるが、アプリエンジニアがちょっと見ただけでは、サーバーのスペックだったり、負荷のかかる時間帯だったり、色々とタイミングがあるので、ちょっとずつ観察していくのが良いかもしれない。

I/Oについてはこちらに詳しく載っているので、あとで確認してみるといいかもしれない。

netstat

netstat(Network statistics)とは、ネットワーク接続やルーティングの状況などの状態を出力します。

TCPおよびUDPプロトコルを対象に統計情報を出力するので、ネットワーク系、例えばLISTENしているportの確認や、 意図しない通信をしていないかなどを確認することができます。 インフラの構築のときなど、どのportが待ち受けているかなど便利かもしれません。

$ netstat -lt    # TCPプロトコルで、LISTEN中(待ち受け中)のソケットを確認
$ netstat -an | grep LISTEN  # アクティブなソケットでホストやユーザーの名前解決せずそのまま表示してgrepに渡す

| | 内容 | |-A |接続状態を表示するアドレスファミリを指定| |-I |指定したNICの情報のみ表示(ex. -Ieth0)| |-a| 全てのアクティブなソケットを表示| |-c| 1秒ごとに更新しつつ表示| |-e| 詳細情報を表示| |-g | IPv4IPv6マルチキャストグループメンバーシップ情報を表示| |-i |全てのNICの状態テーブルを表示| |-l |接続待ち(LISTEN)状態にあるソケットのみ表示| |-n| ホストやユーザーの名前解決を行わず数字のまま出力| |-o| ネットワーキングタイマーの情報を出力| |-p| ソケットが属すプログラムのPIDとプロセス名を表示| |-r| ルーティングテーブルを表示| |-s| 各プロトコルの統計情報を表示| |-t| TCPソケットを表示| |-u| UDPソケットを表示| |-v| 詳細な情報を表示|

tcpdump

tcpdumpとは、ネットワークインターフェースを通るパケットのヘッダ情報を出力するコマンドです。

AmazonLinux1にはデフォルトでインストールされていなかったので、yum install tcpdumpですぐインストールできます。

このコマンドは、ネットワーク機器の間の通信内容を取得し、正常なパケットが送受信されているかどうかを確認します。リバースプロキシの設定をしていて、ぶら下がっているサーバー(ソフトインストール前とか)に対して、本当に通信されているかどうかなども確認できます。笑

ネットワークトラフィックをダンプする。膨大に流れているパケットを適切にフィルターして使用する必要がある。 Wikipediaで紹介されている言い方だと、計算機ネットワーク調査ツールと呼ばれるものの一種である。 Windowsには、Windumpというコマンドが用意されていて、Windows上でtcpdumpを動かせるようにしたもの。 基本的にスーパーユーザーになる必要がある。理由として、プロミス・キャストモードを利用するためである。

  • プロミス キャストモードとは

プロミスとは「無差別の」という意味で、自分宛のパケットでない信号も取り込んで処理するということを示す。 主な使用目的としては、適切なルーティングがなされているか、デバッグなどである

オプションが多いので、ぜひこちらの表を参考にしてみてください。

【tcpdump】ネットワークトラフィックをダンプ出力する | 日経 xTECH(クロステック)

ここでは、使えそうなオプションで例を書いてみます。

# インターフェイスを指定して
$ tcpdump -i eth0

# ホストを指定
$ tcpdump host <IP/Host_name>

# (Hostと)ポート番号を指定して
$ tcpdump port 8080
$ tcpdump host 192.168.0.1 and(or) port 80

# 発信(dst)/受信(src)で絞る
$ tcpdump dst port 80
$ tcpdump src port 80

その他、こちらの記事を参考にしてみてください。

参考