故障対応の原因切り分けで知っておきたいコマンド集（サーバ編）

# システム系コマンド

## Linux稼働時間を表示（uptime）

Linuxの稼働時間を表示する。ping疎通が一時的にNGになった際等に、サーバが再起動が走ったことを疑い、確認することがある。

```bash
$ uptime
 12:16:05 up 48 days, 17:53,  2 users,  load average: 0.00, 0.02, 0.00
```

なお、ロードアベレージはCPUのコア数よりも低い値であることが望ましい。

## プロセス状態の確認（topコマンド,psコマンド）

### （スナップショット的に）実行中のプロセス状態を一覧表示する

（スナップショット的に）実行中のプロセス状態を一覧表示する場合は、psコマンドを使用する。「どのプロセスで高負荷になっているのか？」等の確認で使用する。

```bash
$ ps aux
```

なお、特定サービスのプロセス状況を確認するために、grepコマンドと組み合わせて使用する場合がある。下記は、Nginxのプロセス状況を確認した例である。

```bash
$ ps aux | grep -e nginx -e %CPU
```

### （リアルタイムの）実行中のプロセスを一覧表示する

（リアルタイムの）実行中のプロセス状態を一覧表示する場合は、topコマンドを使用する。なお、オプションに「-c」を付けることで、コマンドをフルパス表示できるため、おすすめである。PSコマンド同様に「どのプロセスで高負荷になっているのか？」等の確認で使用する。

```bash
$ top -c
```

なお、下記のようにpsコマンドでプロセスIDを確認し、「-p」オプションを指定することで、特定のプロセス状況だけを確認することができる。下記は、Nginxのプロセス状況を確認した例である。

```bash
$ ps aux | grep -e nginx -e %CPU
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      2142  0.0  0.0  53788    68 ?        Ss   Jun06   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx     2143  0.0  0.1  85396  3048 ?        S    Jun06   0:03 nginx: worker process
root     13439  0.0  0.0  12108  1088 pts/0    S+   16:53   0:00 grep --color=auto -e nginx -e %CPU

// nginxのプロセスIDを指定して実行する
$ top -cp 2142
top - 16:54:05 up 36 days, 22:31,  1 user,  load average: 0.06, 0.23, 0.16
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1829.2 total,     80.2 free,   1558.7 used,    190.4 buff/cache
MiB Swap:   2048.0 total,    854.2 free,   1193.8 used.    120.1 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 2142 root      20   0   53788     68     68 S   0.0   0.0   0:00.01 nginx
```

#### 出力結果の見方

1行目：uptime（起動時間）と全体的な負荷の情報が出力されている。

```bash
top - 16:45:36 up 36 days, 22:23,  1 user,  load average: 0.01, 0.02, 0.00
```

２～３行目：CPUとタスクに関する状況が出力されている。

```bash
Tasks: 116 total,   1 running, 115 sleeping,   0 stopped,   0 zombie
%Cpu(s): 12.5 us,  0.0 sy,  0.0 ni, 87.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
```

4～5行目：メモリとスワップに関する状況が出力されている。

```bash
MiB Mem :   1829.2 total,     74.0 free,   1558.9 used,    196.3 buff/cache
MiB Swap:   2048.0 total,    854.2 free,   1193.8 used.    119.9 avail Mem
```

## CPU、メモリ、ディスクI/Oの統計情報を確認（vmstat）

仮想メモリやCPU、ディスクI/Oの統計情報を表示する。「--unit」オプションでmを指定することで、MB表示になり見やすくなる。

```bash
$ vmstat --unit m
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0    153    228    115    962    0    0   234    16    3    3  1  0 99  0  0
```

なお、引数に「1」を指定することで１秒間隔で表示することができる。

```bash
$ vmstat --unit m 1
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    153    228    115    962    0    0   234    16    3    3  1  0 99  0  0
 0  0    153    227    115    962    0    0     0     0  150  168  0  0 100  0  0
 0  0    153    227    115    962    0    0     0     0  151  188  0  0 100  0  0
```

## CPU、ディスクI/Oの統計情報を確認（iostat）

CPUの使用率とI/Oデバイスの利用状況を表示する。

```bash
$ iostat -h
Linux 4.18.0-147.8.1.el8_1.x86_64 (XXX-XX-XX-XXX)       07/01/2020      _x86_64_        (3 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.6%    0.0%    0.4%    0.0%    0.0%   98.9%

      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device
    11.96       700.4k        48.5k       2.7T     194.7G vda
     0.00         0.0k         0.0k     416.0k       0.0k scd0
```

## メモリ利用状況の確認（freeコマンド）

メモリの利用状況を表示する。

```bash
// キロバイト単位で参照する
$ free

// メガバイト単位で参照する
$ free -m

// ギガバイト単位で参照する
$ free -g
```

## ディスク利用状況の確認（dfコマンド）

ディスクの利用状況を表示する。なお、「-h」オプションを指定することで、適切な単位をつけて表示してくれるため、おすすめである。

```bash
$ df -h
```

## （特定ディレクトリの）ディスク利用状況の確認（duコマンド）

（特定ディレクトリ配下の）ディスク利用状況を表示する。なお、「-h」オプションを指定することで、適切な単位をつけて表示してくれるため、おすすめである。

```bash
$ du -h | sort -hr
```

また、「--max-depth」オプションを指定することで、どの深度まで確認するかを指定することができる。下記はカレントディレクトリ内のディスク利用状況を確認する例である。

```bash
$ du --max-depth=1 -h | sort -hr
772M    .
743M    ./.vscode-server
13M     ./.local
11M     ./.cache
44K     ./.vscode-remote
8.0K    ./.vscode
8.0K    ./.ssh
8.0K    ./.pylint.d
8.0K    ./.config
```

## ボリュームのマウント状況を確認（mountコマンド）

ボリュームのマウント状況を確認する。「データが読み込めない時」等に、ディスクが正しくマウントされているか確認する際に使用する。なお、「-l」オプションを付けずに実行すると、マウントするべきでないディスクまでマウントしてしまう可能性があるため、実行時には注意が必要である。ただ状況を確認するだけの場合は、「-l」オプションを付けることを心がけましょう。

```bash
$ mount -l
```

また、mountコマンドと関連性が深いファイルに「/etc/fstab」があります。これは、サーバ起動時やシステムマネージャが再読み込みされた際に、反映するボリュームのマウント設定内容が記述されています。fstabにマウントの設定が記述されているのにも関わらず、上記の「mount -l」コマンドでマウント状態が確認できない場合は、異常を疑う余地があります。

```bash
$ cat /etc/fstab
```

## Linuxカーネルが出力したメッセージを確認（dmesg）

Linuxカーネル（プロセス管理、メモリ管理、スケジュール管理等のOSの中核機能を担うソフトウェア）が出力した情報を確認する。なお、「-T」オプションを指定することで、時刻情報が見やすくなる。また、「-x」オプションを指定することで、メッセージの情報レベルを表示してくれる。サーバを再起動したが、アプリケーションがデータを正常に読み込めない際等に、dmesgの出力を確認するとディスクが破損している等を見つけれる場合がある。

```bash
$ dmesg -Tx
```

## 過去のリソース利用傾向を確認（sar）

過去のリソース（CPU,メモリ等）の利用傾向を確認する。なお、サーバによってはインストールされていないことがあるため、注意が必要である。

```bash
// 過去のCPU利用傾向を確認する
$ sar -u

// 過去のメモリ利用傾向を確認する
$ sar -r
```

# ネットワーク系コマンド

## ネットワークの疎通を確認（ping）

ネットワークの疎通を確認する。ちなみに、IPアドレス「8.8.8.8」はGoogleのPublicDNSを示している。pingの疎通チェックがNGの場合は、次に紹介する「traceroute」コマンドを利用して、どこで疎通NGとなったのかを確認すると良いだろう。

```bash
// IPアドレスで疎通を確認する
$ ping 8.8.8.8

// ホスト名で疎通を確認する ※名前解決もしてくれる
$ ping google.com

// １秒間隔で疎通を確認し続ける
$ ping -i 1 8.8.8.8

// IPv4で疎通を確認する
$ ping -4 google.com

// IPv6で疎通を確認する
$ ping -6 google.com
```

## ネットワークの経路を確認（traceroute）

ネットワークの経路を確認する。なお、サーバによってはインストールされていないことがあるため、注意が必要である。どこで疎通NGとなったのかを確認する際に使用することが多い。

```bash
$ traceroute 8.8.8.8
```

## 名前解決を確認（nslookup,dig）

名前解決を確認する。nslookupとdigコマンドの違いは、前者はネームサーバの応答結果を見やすく加工してくれるのに対して、後者はネームサーバの応答結果をそのまま表示する。DNSが疑わしい場合は、まずこのコマンドを使用して、名前解決の正常性を確認すると良いだろう。

```bash
// 正引きを確認する
$ nslookup google.com

// 逆引きを確認する
$ nslookup 8.8.8.8
```

```bash
// 正引きを確認する
$ dig google.com

// 逆引きを確認する
$ dig -x 8.8.8.8
```

## TCPソケットの接続状況を確認（ss,netstat）

TCPソケットの接続状況を確認する。なお、netstatはRHEL7以降では非推奨となっており、代替コマンドとしてssが推奨されている。以下は、IPv4のTCPソケットの接続状況を確認するコマンドである。ポートの使用状況から、どんなサーバが動作しているのかを確認することに利用したりする。なお、非推奨ではあるがnetstatの方が出力が見やすいため、完全に利用できなくなるまではssコマンドよりも、netstatコマンドを使用すると良いだろう。

```bash
// 推奨
$ ss -at4

// 非推奨
$ netstat -at4
```

## ネットワークの状況の確認（ip,ifconfig）

ネットワークの状況を確認する。なお、ifconfigはRHEL7以降では非推奨となっており、代替コマンドとしてipが推奨されている。以下は、存在するインターフェースごとのネットワーク設定を表示するコマンドである。ネットワークインターフェースのリンクアップ状況の確認等に使用する。

```bash
// 推奨
$ ip a

// 非推奨
$ ifconfig -a
```

## ルーティングテーブルの確認（ip,route,netstat）

ルーティングテーブルを確認する。なお、routeはRHEL7以降では非推奨となっており、代替コマンドとしてipが推奨されている。以下は、ルーティングテーブルを確認するコマンドである。非推奨ではあるが、routeコマンドの出力の方が見やすいため、完全に利用できなくなるまではipコマンドよりも、routeコマンドを使用すると良いだろう。

```bash
// 推奨
$ ip r

// 非推奨
$ route

// 非推奨
$ netstat -nr
```

## ARPキャッシュテーブルを確認

ARPキャッシュテーブルを確認する。なお、arpはRHEL7以降では非推奨となっており、代替コマンドとしてipが推奨されている。以下は、ARPキャッシュテーブルを確認するコマンドである。一例だが、ルータを交換した際等に、APRキャッシュに前の機器のMACアドレスが残置してしまい、通信障害が発生する場合等があり、その際の切り分けとして使用する。

```bash
// 推奨
$ ip n

// 非推奨
$ arp -a
```

# その他

## ログをリアルタイムで確認

出力されるログをリアルタイムで確認する。現在進行形でトラブルが発生している場合に、どんなログが出力されているのかを確認することに有効である。

```bash
$ tail -f  access.log
```

なお、膨大なログが短時間で出力されるような場合は、grepコマンドと組み合わせて使用することも多い。下記はtailコマンドとgrepコマンドを組み合わせて、404エラーのみを標準出力した例である。

```bash
$ tail -f access.log | grep 404
125.197.158.68 - - [01/Jul/2020:13:45:11 +0900] "GET /404 HTTP/1.1" 301 162 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36" "-"
125.197.158.68 - - [01/Jul/2020:13:45:11 +0900] "GET /404 HTTP/2.0" 404 548 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36" "-"
125.197.158.68 - - [01/Jul/2020:13:45:11 +0900] "GET /favicon.ico HTTP/2.0" 404 548 "https://example.com/404" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36" "-"
```

## （様々な）条件にマッチするファイルを検索

（様々な）条件にマッチするファイルを検索する。ディレクトリ・ファイル構成が把握できておらず、探しているファイルがどこにあるかわからない場合がよくあります。そんな際に、本コマンドを使用して検索することが多い。

```bash
// 検索パス配下で、指定したファイルを検索する
$ find 検索パス -name ファイル名

// 実行例
$ find /var/log/ -name "access.log"
/var/log/nginx/access.log

// ワイルドカードを使用した例
$ find /var/log/ -name "*.log"
/var/log/letsencrypt/letsencrypt.log
/var/log/dnf.rpm.log
/var/log/dnf.librepo.log
/var/log/boot.log
/var/log/nginx/error.log
/var/log/nginx/access.log
/var/log/audit/audit.log
/var/log/cloud-init-output.log
/var/log/cloud-init.log
/var/log/dnf.log
/var/log/sssd/sssd_nss.log
/var/log/sssd/sssd_implicit_files.log
/var/log/sssd/sssd.log
/var/log/hawkey.log
/var/log/tuned/tuned.log

// ファイル種別（ファイルのみ）を指定した例
$ find /opt/docker/ -name "*.conf" -type f
/opt/docker/nginx/conf/default.conf
/opt/docker/nginx/conf/nginx.conf

// ファイル種別（ディレクトリのみ）を指定した例
$ find /opt/docker/ -name "nginx" -type d
/opt/docker/nginx
```

## ファイル内から特定の文字を含む行を抽出

ファイル内から特定の文字を含む行を抽出する。とても頻繁に利用するコマンドであるが、故障対応においてはログからエラーが出力されているかを確認するために、使用したりすることが多い。ここでは、個人的に使用する例を紹介したいと思う。

```bash
// 指定したファイル内から特定の文字を含む行を抽出
$ grep access.log nginx.conf
    access_log  /var/log/nginx/access.log  main;

// ワイルドカードを使用してファイル群から特定の文字を含む行を抽出
$ grep http *.conf
default.conf:    return       301 https://$host$request_uri;
default.conf:    listen       443 ssl http2;
default.conf:    listen       [::]:443 ssl http2;
default.conf:        proxy_pass                             http://localhost:5601;
nginx.conf:http {
nginx.conf:                      '$status $body_bytes_sent "$http_referer" '
nginx.conf:                      '"$http_user_agent" "$http_x_forwarded_for"';

// -vオプションで特定の文字列だけ抽出から除外する
$ echo -e "test\ntast\ntest" > test.txt
$ cat test.txt
test
tast
test
$ grep test test.txt
test
test
$ grep -v test test.txt
tast

// -eオプションでOR検索で特定の文字列を抽出する
$ grep -e test -e tast test.txt
test
tast
test

// -iオプションで大文字と小文字を区別せずに抽出
$ grep Access.log nginx.conf
$ grep -i Access.log nginx.conf
    access_log  /var/log/nginx/access.log  main;

// サブディレクトリも含めて検索を実行し、シンボリックリンクの先も対象とする
$ grep -R http
nginx/conf/default.conf:    return       301 https://$host$request_uri;
nginx/conf/default.conf:    listen       443 ssl http2;
nginx/conf/default.conf:    listen       [::]:443 ssl http2;
nginx/conf/default.conf:        proxy_pass                             http://localhost:5601;
nginx/conf/nginx.conf:http {
nginx/conf/nginx.conf:                      '$status $body_bytes_sent "$http_referer" '
nginx/conf/nginx.conf:                      '"$http_user_agent" "$http_x_forwarded_for"';
nginx/html/index.html:<a href="http://nginx.org/">nginx.org</a>.<br/>
nginx/html/index.html:<a href="http://nginx.com/">nginx.com</a>.</p>
```

## ファイルを一覧表示

ファイルを一覧表示する。ここでは、個人的に使用する例を紹介したいと思う。

```bash
// シンプルにファイルを一覧表示
$ ls
conf  docker-compose.yml  html

// ファイル情報も表示
$ ls -l
total 12
drwxr-xr-x 2 root root 4096 May 22 20:52 conf
-rw-r--r-- 1 root root  655 May 22 20:37 docker-compose.yml
drwxr-xr-x 2 root root 4096 May 20 16:02 html

// ドットファイルも表示
$ ls -la
total 20
drwxr-xr-x 4 root root 4096 May 22 20:37 .
drwxr-xr-x 5 root root 4096 May 19 13:47 ..
drwxr-xr-x 2 root root 4096 May 22 20:52 conf
-rw-r--r-- 1 root root  655 May 22 20:37 docker-compose.yml
drwxr-xr-x 2 root root 4096 May 20 16:02 html

// ファイルの更新日が新しい順にリストし、その並びを逆順に表示する
$ ls -latr
total 20
drwxr-xr-x 5 root root 4096 May 19 13:47 ..
drwxr-xr-x 2 root root 4096 May 20 16:02 html
-rw-r--r-- 1 root root  655 May 22 20:37 docker-compose.yml
drwxr-xr-x 4 root root 4096 May 22 20:37 .
drwxr-xr-x 2 root root 4096 May 22 20:52 conf

// ファイルサイズを人が読みやすい形式で表示する
$ ls -latrh
total 20K
drwxr-xr-x 5 root root 4.0K May 19 13:47 ..
drwxr-xr-x 2 root root 4.0K May 20 16:02 html
-rw-r--r-- 1 root root  655 May 22 20:37 docker-compose.yml
drwxr-xr-x 4 root root 4.0K May 22 20:37 .
drwxr-xr-x 2 root root 4.0K May 22 20:52 conf

// 再帰的に表示する
# ls -latrhR
.:
total 20K
drwxr-xr-x 5 root root 4.0K May 19 13:47 ..
drwxr-xr-x 2 root root 4.0K May 20 16:02 html
-rw-r--r-- 1 root root  655 May 22 20:37 docker-compose.yml
drwxr-xr-x 4 root root 4.0K May 22 20:37 .
drwxr-xr-x 2 root root 4.0K May 22 20:52 conf

./html:
total 16K
-rw-r--r-- 1 root root  612 Apr 14 23:19 index.html
-rw-r--r-- 1 root root  494 Apr 14 23:19 50x.html
drwxr-xr-x 2 root root 4.0K May 20 16:02 .
drwxr-xr-x 4 root root 4.0K May 22 20:37 ..

./conf:
total 16K
-rw-r--r-- 1 root root  670 May 20 19:32 nginx.conf
drwxr-xr-x 4 root root 4.0K May 22 20:37 ..
-rw-r--r-- 1 root root 1.3K May 22 20:52 default.conf
drwxr-xr-x 2 root root 4.0K May 22 20:52 .
```

## テキストをスクロール表示

テキストを表示する。ログからエラーの箇所を重点的にチェックする時等に使用する。

```bash
$ more access.log
```

```bash
$ less access.log
```

```bash
$ view access.log
```

### 「more」「less」「view」コマンドの違い

細かな違いはあるが、知っておきたい違いを以下の表にまとめています。

|コマンド|表示の速さ|終了方法|
|---|---|---|
|more|速い|行末まで行くと自動終了 / q / Ctrl＋C|
|less|速い|q|
|view|遅い|:q|