Linuxコマンドを学んでいこう(基礎その2 システムの状況とか)
システムの状況とかを調べたりする
システムの状況とか構成とかを調べたりするコマンド。
謎システムのときに手掛かりを得たり、なにかトラブルが起きたときに状況を把握するのに役立つものたち。
今入っているシステムを調べる
uname
そのそもOSの種類やバージョンが判らなかったりするときに使ったりする。
オプションは
-a --all すべての情報
-m --machine CPUの種類(x64 or i386)
-n --nodename ネットワーク上のホスト名
-r --releaase OSのリリース番号
-s --sysname OSの名称
-v OSのバージョン
実行例
$ uname -a
Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux
-a で全ての情報を表示したとき。
OSの種類 ホスト名 リリース バージョン(コンパイル日時) CPUの種類 GNU/Linux
の順で並んでいる。最後のGNU/Linuxはあまり気にしないでよい。
OSの種類といっても、ここではLinuxとしかでない。デストリビューション出ると思ったらはずれ。
ハードウェア情報と言ってもここではCPUが32bit or 64bitしかでない。残念。
リリース番号はカーネルのバージョン。
よって、このコマンドで得られる情報はごく基本的なもの。
そもそも入っているシステムがLinuxなのかSoralisなのか、他の何かなのかっていうときに使うと幸せになれる。
cat /etc hoge-release
コマンドに挙げていいものか謎だけど、unameにて調べたはいいが、
デストリビューションとそのバージョンが判らないと何にもできないじゃん!!というときに使う。
/etc/配下にhoge-releaseというファイルがあるので、これをcatなりなんなりで見ればわかる。
実行例
この場合はCentOS 6.8であることがわかる。
上記unameの情報と合わせると、CentOS release 6.7 x86_64 と判明。
するとパッケージなんかはCentOS6系のamd64用を使えばよいことが判る。
ちなみにhoge-releaseはデストリビューションによって-が_だったりするので適宜。
Debianの場合
$ cat /etc/debian_version
8.7
この場合Debian8.7。
プロセスを調べる
ps
動作中のプロセスを表示する。
オプションには-付けるものと付けないもの、付けると意味が変わるものがあるので注意が必要。
オプション
a 自分以外のユーザーのプロセスを表示する
u ユーザー名表示
x 制御端末のないプロセスも表示する
f 親子関係をツリー上に表示する
-e すべてのプロセスを表示する
-f 完全フォーマットで表示する
-w 長い行は折り返して表示
w 1行追加して表示を拡大する。wを増やすことによって行数をさらに増やせる
良く使うのは
aux(すべてのユーザー、ユーザー名表示、制御端末無いプロセス(デーモンなど)も表示)
-ef すべてのプロセスを完全フォーマットで表示
auxfで親子関係を表示することもある。ちなみに-を付けないオプションが推奨されているらしい。
全プロセス表示すると量的に大変なことになるので、パイプでgrepに渡すことが多い。
実行例
$ ps auxf | grep "apache" | grep -v "grep"
root 11400 0.0 2.2 251100 22640 ? Ss Feb11 0:27 /usr/sbin/apache2 -k start
www-data 71076 0.0 3.1 255476 32144 ? S 07:35 0:00 \_ /usr/sbin/apache2 -k start
www-data 71077 0.0 4.8 269112 48868 ? S 07:35 0:00 \_ /usr/sbin/apache2 -k start
www-data 71079 0.0 4.3 266488 44220 ? S 07:35 0:01 \_ /usr/sbin/apache2 -k start
www-data 71080 0.0 3.4 255536 34604 ? S 07:35 0:00 \_ /usr/sbin/apache2 -k start
www-data 72322 0.0 3.7 260152 38284 ? S 08:12 0:00 \_ /usr/sbin/apache2 -k start
www-data 72325 0.0 1.4 252776 14932 ? S 08:12 0:00 \_ /usr/sbin/apache2 -k start
www-data 72327 0.0 0.8 251124 8688 ? S 08:12 0:00 \_ /usr/sbin/apache2 -k start
www-data 72328 0.0 3.4 256548 35352 ? S 08:12 0:00 \_ /usr/sbin/apache2 -k start
www-data 72329 0.0 3.5 256604 36372 ? S 08:12 0:00 \_ /usr/sbin/apache2 -k start
www-data 72330 0.0 3.3 255536 33808 ? S 08:12 0:00 \_ /usr/sbin/apache2 -k start
出力されている情報の並びは
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
$ ps -ef | grep "php" | grep -v "grep"
root 11019 1 0 Feb11 ? 00:00:30 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
www-data 11021 11019 0 Feb11 ? 00:00:00 php-fpm: pool www
www-data 11022 11019 0 Feb11 ? 00:00:00 php-fpm: pool www
同じく情報は
UID PID PPID C STIME TTY TIME COMMAND
top
実行中のプロセスを継続的に監視する。
システムの負荷状況、プロセス・メモリ・スワップ・CPUの統計情報が得られ、
かつデフォルトで5秒ごとに最新情報に更新される。
psがプロセスを調べるのに特化しているのに対し、こちらはシステム状況を把握・監視するのによく使う。
実行例
$ top
top - 00:19:38 up 66 days, 14:30, 3 users, load average: 0.06, 0.09, 0.08
Tasks: 300 total, 1 running, 299 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3%us, 0.1%sy, 0.0%ni, 99.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 2773648k total, 2332076k used, 441572k free, 145776k buffers
Swap: 2916348k total, 391080k used, 2525268k free, 804756k cachedPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3718 tmin 20 0 1561m 282m 31m S 1.3 10.4 4350:01 firefox
12457 tmin 20 0 15164 1404 936 R 0.3 0.1 0:00.02 top
1 root 20 0 19352 1188 1000 S 0.0 0.0 0:00.92 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:12.17 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 6:52.21 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0
6 root RT 0 0 0 0 S 0.0 0.0 0:04.26 watchdog/0
7 root RT 0 0 0 0 S 0.0 0.0 0:19.38 migration/1
(以下省略)
1行目
top - 00:19:38 up 66 days, 14:30, 3 users, load average: 0.06, 0.09, 0.08
現在時刻 稼働時間 ログインユーザー数 ロードアベレージ(実行待ちジョブの平均 1分前 5分前 15分前)
2行目
Tasks: 300 total, 1 running, 299 sleeping, 0 stopped, 0 zombie
タスクの合計数 稼働中のタスク数 待機中のタスク数 停止タスク数 ゾンビタスク数
3行目
Cpu(s): 0.3%us, 0.1%sy, 0.0%ni, 99.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
CPUの利用時間
us ユーザー sy システム ni 優先度変更したの id アイドル wa I/O終了待ち hi ハードウェア割り込み要求 si ソフトウェア割り込み要求
st ゲストOSが割り当て要求したけど割り当ててもらえなかった
4行目
Mem: 2773648k total, 2332076k used, 441572k free, 145776k buffers
メモリ。
合計メモリ 利用メモリ 空きメモリ 利用メモリの内バッファ利用してるメモリ
5行目
Swap: 2916348k total, 391080k used, 2525268k free, 804756k cached
スワップ。
合計スワップ 利用スワップ 空きスワップ キャッシュしてるスワップ。
7行目 8行目以下の説明。
8行目以下 実行されているプロセスが(デフォルトでは)CPUをより多く使用している順に並ぶ。
立ち上げると(デフォルトでは)5秒ごとに更新して表示し続けるので、終了はqかCtrl+Cで止める。
free
メモリの利用状況を調べる。デフォルトではKB単位。
オプション
-m MB単位で表示
-s 秒 指定した感覚で表示し続ける。
実行例
$ free
total used free shared buffers cached
Mem: 2773756 2132416 641340 34424 49736 204928
-/+ buffers/cache: 1877752 896004
Swap: 2916348 508784 2407564
Mem:メモリの使用状況
Swap:スワップの使用状況
buffersとcachedはOSによって予約されている領域。buffersおよびcacheは、メモリが不足する場合に開放して利用できるようにする。
よって、実質的なメモリの使用量および利用可能量を見るためには、2行目の-/+ buffers/cache行を見るのが正しい。
top,freeによるメモリ状況の見方については一昔前から議論があり、
主には「十分なメモリを積んでいるはずなのにSwapを使用している!!メモリが足りないのか!?」というものだ。
実際の所、この「実質的なメモリの使用量および利用可能量」ではなく一行目のfreeの値だけを見ているか、
活動が少ない部分をメモリから排除して swap に追い出し, バッファやキャッシュに転用するというカーネルの動作を誤って解釈していることによる。
ただし、実際Swapへのアクセスが頻発している時にはメモリ不足(この原因は搭載メモリが足りない・何らかのメモリリークが起きているなど別の切り分けが必要)
の可能性が高い為、何らかの対策が必要かもしれない。(この辺は深入りしないほうが幸せだと思う)
vmstat
メモリーやCPUの負荷率や使用状況を表示する
$ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 508764 637284 51256 206644 1 0 7 11 4 4 3 1 97 0 0
si(スワップイン), so(スワップアウト)が頻繁に起きている場合はメモリ不足が疑われる。
システムの搭載メモリが不足しているか、メモリリークが起きていないかといったことを調べるには、
一つのコマンド結果ではなく、各コマンドの特徴を把握して複数の角度から考えることが必要だったりする。
uptime
稼働時間とload average。topコマンドの一行目とほぼ同じ。
$ uptime
00:20:59 up 37 days, 13:31, 3 users, load average: 0.00, 0.08, 0.12
障害等発生時にこの辺で現状確認ができるかもしれない。
ある程度切り分けできたら詳細ログ調査などに入ることもままある。
例
topで負荷状況・再起動有無等確認⇒psでプロセスの死活・再起動有無の確認⇒/var/log/messagesやその他のアプリログの確認、みたいな。