いにしえのサーバ障害調査に使用するコマンドまとめ

## はじめに
株式会社メディアテック所属の @mt-h2 です。
普段は OutSystems を利用したローコードでシステム開発を行っています。

今回は今までと打って変わり、現職につくまでずっとサーバを触ってきたので、忘れないようメモがてら昔々に対応していたサーバ障害時の調査に使用するコマンドをまとめたいと思います。

## 経歴
レンタルサーバ運営企業：サーバエンジニア...5年（オペレータに毛が生えた程度）
ゲーム開発企業：社内SE...10年（下流メイン、設計～リリースまで、たまに要件定義）

この15年の間、業務内容はその都度異なっていましたが、共通してオンプレサーバの構築・保守運用を行ってきました。

使用していたOSは主に以下を対応していました。
- FreeBSD
- Debian
- RHEL
- CentOS
- Ubuntu
- WindowsServer

経歴ではFreeBSDとCentOSが長くなりますが、今回はCentOSを対象に記載したいと思います。
※systemdに移行が始まる以前だったと記憶

:::note warn
クラウド流行以前の時代（VPS流行くらいまで）の記憶を掘り起こしたものになりますので、現行OSでは通用しない可能性があります。その点につきましてはご了承ください。
:::

紹介するコマンドは LPIC-1 レベルとなります。

## 頻繁に使用していたコマンド

### # grep -iE "warn|error|false"
[grep](http://man.he.net/?topic=grep&section=all)
文字列から障害に関する文字列を絞り込む際に使用。
ざっくり確認したい時にとりあえず使用していました。
```bash
$ dmesg | grep -iE "warn|error|fail" checkfile
```

### # dmesg
[dmesg](http://man.he.net/?topic=dmesg&section=all)
kernelのリングバッファ確認。
システムに異常が発生している場合、大抵ここに障害内容が出力されています。
これもとりあえず調査に入ったら打っとけコマンド
```bash
$ dmesg
```

### # w
[w](http://man.he.net/?topic=w&section=all)
ロードアベレージとログインユーザの確認。
これも最初にサッと実行して確認するもの。
ロードアレベージについては以下の記事で分かりやすく解説されています。
[LoadAverage(ロードアベレージ)とは一体何者？](https://qiita.com/Takao_/items/8cce7118b020e80750d4)
```bash
$ w
```

### # top
[top](http://man.he.net/?topic=top&section=all)
稼働しているプロセスの確認。
Shift+M（メモリソート）、Shift+P（CPUソート）はよく使っていました。
-U オプションで特定ユーザに絞り込むこともできるので、ユーザが特定できている場合に使用すると便利。
```bash
$ top
$ top -U username
```

### # ps auxww
[ps](http://man.he.net/?topic=ps&section=all)
現在のプロセスを確認。
top コマンドはリアルタイムで画面バッファ分しか表示されませんが、ps コマンドは実行時のプロセス全てが確認可能。
```bashsh
$ ps auxww
```

オプションはmanを確認いただければと思いますが、よく聞かれたのが「ww」の部分。
ざっくり言うと、これを付けないと表示内容の一部が省略されます。なら「w」は1個でいいように見えますが、1個では長すぎるものはまだ省略されます。2個つけてようやく全て表示されます。謎仕様。

### # netstat -ln
[netstat](http://man.he.net/?topic=netstat&section=all)
ネットワークの通信状況確認。
例えばsshに繋がらない問題があった時に、22ポート（デフォルト）でsshdが稼働しているか等を確認していました。
```bash
$ netstat -ln
```

### # shutdown (-h/-r) now
[shutdown](http://man.he.net/?topic=shutdown&section=all)
サーバの停止・再起動に使用。
-h が停止、-r がリブートです。
オプション間違いで誤って停止したりする事があるので、[halt](http://man.he.net/?topic=halt&section=all) と [reboot](http://man.he.net/?topic=reboot&section=all) を使用した方が分かりやすいかもしれません。
```bash
$ shutdown -h now
$ shutdown -r now
```

## 必要に応じて使用していたコマンド

### # tail
[tail](http://man.he.net/?topic=tail&section=all)
ファイル末尾を確認。
例えば dmesg を確認する際に、最後の方の出力だけ確認したい場合は以下のようにして一部だけ確認していました。
```bash
$ dmesg | tail
```

また、-F オプションを利用すると新しく入力された内容をリアルタイムで出力し続けれるので、特定のログ出力をリアルタイムで確認したい時にも便利。
```bash
$ tail -F /var/log/messages
```

### # kill -KILL
[kill](http://man.he.net/?topic=kill&section=all)
特定のプロセスを落とす時に使用。KILLは強制的（Force）に落とすので、ゾンビプロセスを落とす時に使用していました。
```bash
$ kill -KILL 12345
```

特定のプロセスを全て落としたい時は、[killall](http://man.he.net/?topic=killall&section=all) も便利。
```bash
$ killall apache
```

### # init 1
[init](http://man.he.net/?topic=init&section=all)
シングルユーザモードに移行。
コマンド応答があり、かつシングルユーザモードで操作する必要が出た場合、リブートせずこのコマンドでシングルユーザモードの移行できます（当時は [telinit](http://man.he.net/?topic=telinit&section=all) を使用していた気がする…）
```bash
$ init 1
```

### # ifconfig
[ifconfig](http://man.he.net/?topic=ifconfig&section=all)
ネットワークインタフェース設定を確認。
ネットワーク速度が遅い・そもそもネットワークに繋がらないなどの状況で使用。設定がおかしくなっていたり（例えば何故かHalfDuplexになっていた速度が遅くなっていた等）を確認できます。
```bash
$ ifconfig
```

## 用途別に使用していたコマンド

### # jstat
[jstat](https://docs.oracle.com/javase/jp/6/technotes/tools/share/jstat.html)
JVMのデータを確認できます。
当時 Java で開発したツールを1か月稼働させると heap 領域で OOM が発生しており、jstat を利用して解放されないオブジェクトの特定を行いました。
```bash
$ jstat
```

### # dd
[dd](http://man.he.net/?topic=dd&section=all)
if/ofを指定してデータをコピー。
障害が発生したディスクの内容を調査する為、他のディスクにデータコピーする際に使用していました。
オプションも充実しており、Seek Error が発生しているブロックは飛ばす等も可能であった（はず）
```bash
$ dd if=<壊れたディスク> of=<コピー先ディスク>
```

後は廃止サーバのディスク初期化に使用したりもしました。
※ 効率が悪いのと信頼性の関係で [DBAN](https://dban.org/) に移行しました

## よく確認していたファイル

### # /var/log/messages
[/var/log/messages](https://linuc.org/study/knowledge/518/)
システムに関するログ。とりあえず見るリストの1つ。

### # /var/log/secure
[/var/log/secure](https://wa3.i-3-i.info/word14281.html)
認証・セキュリティに関するログ。とりあえず見るリストの1つ。

## あとがき
今回はいにしえの記憶を辿って CentOS の障害調査に使用していたコマンド類を洗い出してみました。
こう見ると調査時に使用していたもの・調査方法はある程度お決まりのパターンで実施していたんだなと思いました。

他にも [tcpdump](http://man.he.net/?topic=tcpdump&section=all) や [iptables](http://man.he.net/?topic=iptables&section=all) も割と使っていた記憶があります。

特に [iptables](http://man.he.net/?topic=iptables&section=all) は外部サービスの国別IPを自動で弾く設定をしている事があり、設定の参照サーバの疎通が途絶えるとホワイトリストが空っぽになり誰もアクセスできなくなります。これにより iptables の修正対応をする事がよくありました。

現職についてからはサーバを触る機会がめっきり無くなりましたが、クラウドサーバをまともに触れたことがないの勉強していこうと思います。

## さいごに
株式会社メディアテックでは絶賛 [開発メンバを募集中](https://www.mediatech.jp/recruit) です。
ローコード開発だけではなく、RPAやBIエンジニア諸々多数の募集をしておりますので、みなさまのご応募をお待ちしております。