Linuxサーバー障害対応時に使用するコマンドのまとめ

# 障害対応時に使用するコマンドのまとめ

『インフラエンジニアの教科書２』P178～P180に、障害時によく使うコマンドがまとめられています。
　絶対忘れそうなのと、自分なりにカテゴリ分け・オプションを足したほうが分かりやすかったのでまとめてみました。
　一度まとめてみると理解が深まるため、読むだけではなく手を動かしてみることをおすすめします。

　コマンドいっぺんに流したほうが楽だし、漏れなくてよさそうなので、シェルを書いてみました：[IncCheck](https://github.com/fummysan/IncCheck/tree/add-new-file)


# メモリの情報（総量・使用率）

　freeおよび、後述するtopコマンドにて状況確認可能

```bash:メモリ・ディスク状況表示
# free          ### メモリの使用率表示
             total       used       free     shared    buffers     cached
Mem:       7784672    7472748     311924      60392      15708    1965000
-/+ buffers/cache:    5492040    2292632
Swap:      8388604     306092    8082512
```


## CPUの情報（種類・コア数・使用率）

```bash:CPU情報表示
# cat /proc/cpuinfo | grep -e "model name" -e cores         ### CPU情報
model name	: Intel(R) Core(TM) i7-5600U CPU @ 2.60GHz
cpu cores	: 2
model name	: Intel(R) Core(TM) i7-5600U CPU @ 2.60GHz
cpu cores	: 2
model name	: Intel(R) Core(TM) i7-5600U CPU @ 2.60GHz
cpu cores	: 2
model name	: Intel(R) Core(TM) i7-5600U CPU @ 2.60GHz
cpu cores	: 2
```

　wコマンドの最初の行は「現在時刻、システム稼働時間、ログインユーザ数、システムの平均負荷（1分、5分、15分）」
　このコマンドで現在のログインユーザーも確認できる。

```bash:CPU使用率
# w          ### CPU使用率・ログインユーザー
 21:54:03 up 3 days, 10:35,  3 users,  load average: 0.01, 0.11, 0.14
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
hoge   tty1     :0               Mon11    3days  7:39   0.17s pam: gdm-passwo
hoge   pts/0    :0.0             Mon12    0.00s  0.32s 27.19s gnome-terminal
hoge   pts/3    :0.0             21:28    3:07   0.01s  0.01s bash

# top -d 1          ### CPU使用率・使用プロセス等

top - 21:54:10 up 3 days, 10:35,  3 users,  load average: 0.01, 0.11, 0.14
Tasks: 277 total,   2 running, 272 sleeping,   0 stopped,   3 zombie
Cpu(s):  7.5%us,  4.3%sy,  0.0%ni, 88.0%id,  0.0%wa,  0.3%hi,  0.0%si,  0.0%st
Mem:   7784672k total,  7521924k used,   262748k free,    17832k buffers
Swap:  8388604k total,   306040k used,  8082564k free,  1986068k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
22507 hoge    20   0 2509m 340m  52m S 14.9  4.5  11:24.96 firefox            
 3539 root      20   0  119m 1672 1212 S  1.0  0.0   0:40.55 smcd               
 3959 root       9 -11  8312  364  324 S  1.0  0.0   0:46.03 sav-limitcpu       
 4031 root      20   0  195m  30m  24m S  1.0  0.4   7:39.13 Xorg               
 4355 hoge    20   0 32472 1612  804 S  1.0  0.0   0:02.47 dbus-daemon        
 4541 hoge    20   0  317m 4688 3728 S  1.0  0.1   0:01.33 python             
10145 hoge    20   0  343m  15m 8656 S  1.0  0.2   0:27.23 gnome-terminal     
    1 root      20   0 19364 1228 1000 S  0.0  0.0   0:04.23 init               
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.10 kthreadd           
    3 root      RT   0     0    0    0 S  0.0  0.0   0:03.23 migration/0        
    4 root      20   0     0    0    0 S  0.0  0.0   0:01.37 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:00.09 watchdog/0         
   19 root      20   0     0    0    0 S  0.0  0.0   0:08.84 events/0           
```


## ディスク情報（総量・使用率・アクセス状況・RAID）

```bash:ディスク使用率
# df -h          ### ディスク使用率表示
Filesystem            Size  Used Avail Use% Mounted on
tmpfs                 3.8G  2.4M  3.8G   1% /dev/shm
/dev/sda1             969M   86M  833M  10% /boot
```

```bash:ディスクアクセス
# iostat 1          ### ディスクアクセス
Linux 2.6.32-696.10.2.el6.x86_64 	2018年05月03日 _x86_64_	(4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          28.04    0.02   31.96    0.24    0.00   39.74

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda              18.60       559.34       243.65  166387494   72479848
dm-0             44.74       559.29       243.63  166372930   72473144
dm-1             43.05       554.11       235.65  164832098   70099656
dm-2              1.64         5.17         7.98    1539320    2373488
（以下略）
```

　RAIDについて確認するコマンドとして、MegaCliコマンド・hpssacliコマンドが紹介されていましたが……。
　やだ……私の管理システムMegaCli入ってないしHPでもない……！　そこで一般的に確認できる方法を書いておくことに。

```bash:RAIDの状態表示（RAID組んでいないケース）
# cat /proc/mdstat
Personalities : 
unused devices: <none>
```

　RAID組んでいる場合のケースはこちら。[^rai]

```bash:RAIDの状態表示（正常な状態のRAID1）
# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[0] sda1[1]
1052160 blocks [2/2] [UU]

md1 : active raid1 sdb2[0] sda2[1]
1052160 blocks [2/2] [UU]

md2 : active raid1 sdb3[0] sda3[1]
242091392 blocks [2/2] [UU]

unused devices:
```

※ディスク障害時は```[2/2] [UU]```の表示が```[2/1] [_U]```のように変化。「\_」（アンダースコア）表示パーティションが動作していないため、交換対応が必要。注釈[^cen]の記事が障害発見から交換まで分かりやすくまとまっていて参考になります。


## 接続状況

　netstatが定番。wcしてからgrepで更に絞って詳細見たほうが、滝みたいに出力結果が流れなくておすすめ。

```bash:TCPコネクションの状況
# netstat -an | grep ESTABLISHED | wc -l          ### 張られているTCPコネクションの数
5
# netstat -an | grep ESTABLISHED           ### 張られているTCPコネクションの種類
tcp        0      0 127.0.0.1:5900              127.0.0.1:57990             ESTABLISHED 
tcp        0      0 127.0.0.1:5900              127.0.0.1:57980             ESTABLISHED 
tcp        0      0 127.0.0.1:57990             127.0.0.1:5900              ESTABLISHED 
tcp        0      0 127.0.0.1:57978             127.0.0.1:5900              ESTABLISHED 
tcp        0      0 127.0.0.1:57982             127.0.0.1:5900              ESTABLISHED 
（以下略）
```

　lastコマンドで最近のログインの状況が見られる。「現在ログインしているユーザー」はwコマンドで見れるため、lessなどに渡して、直近のログインの状況も見ておくとよい場合もある。

```bash:ログインの状況
# last | less
hoge   pts/3        :0.0             Thu May  3 21:28   still logged in   
hoge   tty1         :0               Thu Apr  5 22:13 - down  (9+21:38)   
reboot   system boot  2.6.32-696.10.2. Thu Apr  5 22:13 - 19:52 (9+21:38)   
hoge   pts/0        :0.0             Fri Mar 30 11:39 - crash (6+10:34)   
hoge   tty1         :0               Fri Mar 30 11:36 - crash (6+10:37) 
（以下略）
```


## サーバが起動してからの経過時間

　uptimeコマンド[^upt]が推奨されていたが、wコマンドやtopコマンドでまかなえる。読み方は「現在時刻、システム稼働時間、ログインユーザ数、システムの平均負荷（1分、5分、15分）」

```bash:uptime
# uptime
 21:57:40 up 3 days, 10:39,  3 users,  load average: 0.21, 0.23, 0.18
```


## 動いているWebサーバーソフトウェアの状態を確認する

　ポート80の通信状況と、ポート80を使っているプロセスを表示させる。80の前にセミコロンつけたほうが出力結果絞れていいかな。
　※ポート80を使っていない製品や設定もありうるので、参考程度に

```bash:ポート80の通信状況
# netstat -lnp | grep -e :80          ### ポート80で通信しているプロセス
# netstat -lnp | grep -e :80 | grep -o '[0-9]*/' | grep -o [0-9]* | sort | uniq | xargs ps -p
          ### ポート80を使っているプロセスの状況表示
```


## メモリ・HDD・電源ユニットの不具合

　dmesgコマンドを使う。量が多いため、errorやfailなどのワードで検索するとよい。
　また、/var/log/messagesにエラーメッセージが出ている場合もあるため、合わせて検索。

```bash:電源ユニットに問題があるパターン
# dmesg | grep -i -e error -i -e fail
ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.LID_._PSW] (Node ffff88024c876880), AE_TIME


# less /var/log/messages
（ログ抜粋）
May  3 12:57:00 xxxxxxxxxx kernel: ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.LID_._PSW] (Node ffff88024c876880), AE_TIME
May  3 12:57:00 xxxxxxxxxx kernel: ACPI: _PSW execution failed
```

　この場合は、ACPI テーブルが正しくないため、電源管理制御と、PCI root ブリッジの計数データに関連する BIOS エラーがある[^acp]


## USB接続の有無

　上記dmesgの他、partedコマンド、lsusbコマンドで確認。

```bash:partedの例
# parted -l
モデル: ATA SPCC Solid State (scsi)
ディスク /dev/sda: 480GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  1050MB  1049MB  primary  ext4              boot
 2    1050MB  480GB   479GB   primary

（以下略）
```

 lsusbコマンドはオプション-tで階層構造表示&amp;最大通信速度が表示されるため、そちらも分かりやすい。[^lsu]
（USB1.1：12Mbps　USB2.0：480Mbps　USB3.0：5000Mbps）

```bash:lsusbの例
# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:8001 Intel Corp. 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 002: ID 04f3:0301 Elan Microelectronics Corp. 
Bus 002 Device 003: ID 138a:0017 Validity Sensors, Inc. Fingerprint Reader
Bus 002 Device 004: ID 8087:0a2a Intel Corp. 
Bus 002 Device 005: ID 04f2:b449 Chicony Electronics Co., Ltd 

# lsusb -t
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/11p, 480M
    |__ Port 1: Dev 6, If 0, Class=hub, Driver=hub/4p, 12M
        |__ Port 3: Dev 7, If 0, Class=HID, Driver=usbhid, 1.5M
        |__ Port 3: Dev 7, If 1, Class=HID, Driver=usbhid, 1.5M
    |__ Port 5: Dev 2, If 0, Class=HID, Driver=usbhid, 12M
    |__ Port 6: Dev 3, If 0, Class=vend., Driver=, 12M
    |__ Port 7: Dev 4, If 0, Class='bInterfaceClass 0xe0 not yet handled', Driver=btusb, 12M
    |__ Port 7: Dev 4, If 1, Class='bInterfaceClass 0xe0 not yet handled', Driver=btusb, 12M
    |__ Port 8: Dev 5, If 0, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
    |__ Port 8: Dev 5, If 1, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/3p, 480M
    |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/8p, 480M
```


## 参考

[^upt]: [uptimeコマンド出力の見方](http://xn--u9j0md1592aqmt715c.net/solaris-uptime-howto/)
[^acp]: [システムを起動すると、ACPI エラーメッセージが表示される](https://access.redhat.com/ja/articles/1254533)
[^lsu]: [Linux の USB \- Qiita](https://qiita.com/propella/items/66eb1e93cc71ebea3829)
[^rai]: [RAIDの状態を表示するには － ＠IT](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/a048raidstats.html)
[^cen]: [CentOSにてRAIDストレージの障害発生HDD交換の作業メモ \- Qiita](https://qiita.com/ohhara_shiojiri/items/2515d1184603fc3826b4)