Linux障害対応の基本|トラブル発生時の切り分け手順を実践形式で解説

  • URLをコピーしました!

ここまでのLinux中級講座では、 ユーザー・グループ管理、プロセス、サービス、ログ、 パッケージ、ディスク、ネットワーク、cronなど、 Linuxサーバを運用するためのさまざまな操作を学習してきました。

しかし実際の運用では、 コマンドを知っているだけではなく、 「障害が発生したときに、どこに問題があるのかを調べる」 力が必要になります。

CASE 01 Webサイトにつながらない
CASE 02 サーバの動作が遅い
CASE 03 サービスが起動しない
CASE 04 ファイルを書き込めない
「サーバがおかしい」だけでは、
CPU・Memory・Disk・Process・Service・Networkの どこに原因があるのか分かりません。

そこで重要になるのが、 障害の切り分けです。

この記事ではLinux中級講座の最終レッスンとして、 これまで学習したコマンドを組み合わせながら、 Linux障害発生時の基本的な切り分け方法 を学習します。

🐧 LINUX INTERMEDIATE

この記事はLinux中級講座の最終レッスンです。 学習順を確認したい場合は講座一覧から確認できます。

Linux中級講座を見る →
LESSON GOAL この記事のゴール

Linuxで障害が発生したときに、 思いついたコマンドを闇雲に実行するのではなく、 「症状から原因候補を考え、確認結果を使って 障害範囲を狭めていく」 基本的なトラブルシューティングの考え方を身につけます。

目次

Linux障害では「切り分け」が重要

たとえば、 「Webサイトにつながらない」 という障害が発生したとします。

原因として考えられるものは1つではありません。

01 Resource

CPU・Memoryが逼迫している

02 Disk

ディスク容量が不足している

03 Service

Webサービスが停止している

04 Network

IPやRoutingに問題がある

05 Application

設定やアプリケーションに問題がある

最初から原因を決めつけない

トラブルシューティングでは、 確認結果から「正常な範囲」と「異常な範囲」を分ける ことが重要です。

障害対応の基本的な流れ

障害の種類によって確認する内容は異なりますが、 基本的な考え方は共通しています。

STEP 1 症状を整理 何ができない?
STEP 2 影響範囲を確認 どこまで影響?
STEP 3 状態を確認 Resource / Service / Network
STEP 4 ログを確認 何が起きた?
STEP 5 原因を絞る 仮説を検証
症状 → 影響範囲 → 状態 → ログ → 原因

STEP1:まず症状を正確に確認する

障害が発生したとき、 いきなりコマンドを実行する前に 何が起きているのかを整理します。

01 いつから発生している?
02 何ができない?
03 特定ユーザーだけ?
04 特定サーバだけ?
05 エラーは表示されている?
06 直前に変更作業はあった?

たとえば、

CASE A Webだけ接続できない

WebサービスやPortなどを疑いやすい

CASE B SSHも接続できない

NetworkやOS全体まで調査範囲が広がる

同じ「つながらない」でも、 確認すべき場所は大きく異なります。

障害発生前後の「変更」を確認する

障害が突然発生した場合、 直前に何か変更されていないか を確認することも重要です。

CONFIG 設定変更
UPDATE Package更新
DEPLOY Application更新
REBOOT 再起動
NETWORK Network変更
PERMISSION 権限変更
10:00 nginx設定変更
10:05 Service再起動
10:06 Web接続障害

このような場合、 直前の設定変更は重要な原因候補になります。

変更があった=必ず原因、ではない

変更内容は有力な情報ですが、 実際の状態やログも確認して 仮説が正しいか判断します。

STEP2:CPU・メモリなどのリソースを確認する

「サーバ全体が遅い」 「処理が終わらない」 といった障害では、 CPUやメモリを確認します。

top
Linux Terminal
$ top

top - 14:21:03 up 25 days
%Cpu(s): 92.1 us, 3.2 sy, 4.7 id

MiB Mem :
  7976.0 total
   215.4 free
  6842.2 used
   918.4 buff/cache

CPU使用率が高いことが分かったら、 次は どのプロセスがCPUを使用しているのか を確認します。

ps aux --sort=-%cpu | head
$ ps aux --sort=-%cpu | head

USER       PID %CPU %MEM COMMAND
app       2481 91.2 18.4 java
mysql     1320  8.2 24.1 mysqld
root       842  0.3  0.2 sshd
01 Serverが重い
02 top
03 CPU 95%
04 psでProcess確認
「CPU使用率が高い」で調査を止めない

CPUが高いことは現象です。 そこから どのプロセスが原因なのか まで調査を進めます。

ディスク容量を確認する

ファイルを書き込めない、 ログ出力に失敗するなどの場合は ディスク容量も確認します。

df -h
$ df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        50G   49G  1.0G  99% /
/dev/sdb1       100G   42G   58G  42% /data

この例では、 ルートファイルシステム / が99%使用されています。

次に どのディレクトリが容量を使用しているのか を確認します。

sudo du -h --max-depth=1 / | sort -hr
$ sudo du -h --max-depth=1 / | sort -hr

49G   /
31G   /var
8.0G  /usr
4.2G  /home
1.1G  /opt

/var が大きいことが分かったので、 さらに範囲を絞ります。

sudo du -h --max-depth=1 /var | sort -hr
STEP 1 df -h / が99%
STEP 2 du / /varが大きい
STEP 3 du /var /var/logが大きい
STEP 4 原因候補 大量ログなど

障害調査では、 広い範囲から徐々に狭い範囲へ 調べていくことが重要です。

STEP3:サービスの状態を確認する

Webサイトなど特定のサービスだけ利用できない場合は、 まずサービス状態を確認します。

systemctl status nginx
$ systemctl status nginx

● nginx.service - nginx web server
   Loaded: loaded
   Active: failed (Result: exit-code)
SERVICE STATUS nginx : failed

これで nginxが正常に起動していない ことは分かりました。

ただし、 まだ停止した原因は分かっていません。

「nginxが停止している」ことは分かりました。
では、なぜ停止したのでしょうか?

次にログを確認します。

STEP4:ログから原因を調べる

systemdで管理されているサービスなら、 journalctl を利用してログを確認できます。

journalctl -u nginx -n 50
$ journalctl -u nginx -n 50

nginx[1420]: bind() to 0.0.0.0:80 failed
nginx[1420]: address already in use
systemd[1]: nginx.service: Failed with result 'exit-code'
ERROR address already in use 80番ポートがすでに使用されている

ログから、 80番ポートの競合が原因候補だと分かりました。

そこで次は、 80番ポートを使用しているプロセスを確認します。

sudo ss -lntp
$ sudo ss -lntp

State  Local Address:Port  Process

LISTEN 0.0.0.0:22         sshd
LISTEN 0.0.0.0:80         httpd
SYMPTOM Web接続不可
STATUS nginx failed
LOG Port 80競合
CAUSE httpd使用中
1つの確認結果から次の確認を決める

systemctljournalctlss のように、確認結果を根拠にして次の調査へ進めます。

STEP5:通信できない場合はネットワークを切り分ける

Linuxサーバから通信できない場合は、 ネットワーク状態を順番に確認します。

01 IP ip addr
02 Route ip route
03 Reachability ping
04 Port ss
05 DNS getent / dig

IPアドレスを確認する

ip addr

想定したIPアドレスが ネットワークインターフェースへ設定されているか確認します。

ルーティングを確認する

ip route
$ ip route

default via 192.168.10.1 dev ens160
192.168.10.0/24 dev ens160 proto kernel scope link

デフォルトゲートウェイなど、 宛先へ通信するための経路を確認します。

pingで疎通を確認する

ping -c 4 192.168.10.1

ネットワークでは、 近い場所から確認すると障害範囲を絞りやすくなります。

自分自身
Gateway
Remote Server
ping成功 = Applicationも正常、ではない

pingはIPレベルの到達性を確認する材料です。 Webサービスなどを確認する場合は、 PortやService状態も確認します。

IPでは通信できるのにホスト名では失敗する場合

IP ADDRESS 198.51.100.20 ✓ 通信可能
HOSTNAME server.example.com ✕ 通信不可
CHECK DNS 名前解決を確認

この場合、 IPレベルの通信そのものより 名前解決 を疑いやすくなります。

getent hosts server.example.com

DNSを詳しく確認したい場合は、 環境に応じて dig なども利用できます。

障害発生時の「とりあえず再起動」に注意

NG 原因は分からないけど、とりあえず再起動しよう

再起動によって一時的に復旧する場合はあります。

しかし、 すぐに再起動すると 障害発生時のプロセス状態や一時的な情報が失われる 可能性があります。

可能であれば再起動前に確認
01

CPU・Memory状態

02

Process状態

03

Service状態

04

Log・Error

05

Network状態

復旧と原因調査は別の目的

緊急時には復旧を優先することもあります。 その場合でも可能な範囲で状態やログを記録してから対応すると、 後から原因を調査しやすくなります。

ここで実際に試してみよう:Linux障害切り分けシミュレーター

ここからは、 Linux中級で学習してきたコマンドを使って 障害原因を調査してみましょう。

INTERACTIVE LAB

Linux Troubleshooting Console

TROUBLESHOOTING
Linux Troubleshooting Console
$ 調査コマンドを選択してください。
YOUR DIAGNOSIS

どこに問題がありそうですか?

コマンドを実行してから判断してみましょう

1つの結果だけでなく、複数の確認結果を組み合わせて原因を考えます。

理解度チェック:次に何を確認する?

$ systemctl status nginx

● nginx.service
  Active: failed (Result: exit-code)

Webサイトへ接続できず、 nginxがfailedになっていました。 次の確認として最も適切なのはどれでしょうか?

回答を選択してください

「サービスが停止している」と分かったあとに、 何を知りたいか考えてみましょう。

Linux障害対応でよく使う確認コマンド

確認したいこと 代表的なコマンド 確認内容
CPU・Memory top サーバ全体の負荷
Process ps 実行中プロセス
Disk df -h ファイルシステム使用率
Directory du 容量を使用している場所
Service systemctl サービス状態
Log journalctl エラー・原因候補
IP ip addr IP設定
Route ip route ルーティング
Reachability ping IP到達性
Port ss 待受ポート
DNS getent / dig 名前解決

重要なのは「コマンド」より「確認する目的」

障害対応では、 コマンドをたくさん暗記することそのものが目的ではありません。

NG とりあえずtopを実行 目的がない
GOOD Serverが遅い CPU負荷を確認したい topを使う
症状 → 仮説 → 確認したいこと → コマンド

この考え方ができれば、 初めて遭遇する障害でも 次に何を確認すればよいか を考えられるようになります。

Linux障害切り分けで覚えておきたい3つの考え方

01 広い範囲から絞る

Server全体 → Service → Process → Logなど、 徐々に問題範囲を狭めます。

02 1つの結果だけで断定しない

CPU使用率やping結果など、 1つの情報だけで原因を決めつけないことが重要です。

03 正常な範囲を確定する

「ここまでは正常」と確認することで、 調査対象を少しずつ減らしていきます。

障害対応では調査結果を記録する

実際の運用では、 実行したコマンドや確認結果を記録しておくことも重要です。

14:03 障害発生

Web接続不可

14:05 Service確認

nginx failed

14:07 Log確認

Port 80 conflict

14:10 原因候補特定

httpdが使用

他の担当者へ引き継げる
後から原因を振り返れる
同じ障害の再発時に利用できる
障害対応手順を改善できる

確認問題:Linux障害切り分けの基本を理解できたか確認しよう

QUESTION 01

Linuxサーバ全体の動作が非常に遅い場合、 最初の確認候補として適切なのはどれですか?

正解:B

topではCPU・Memory・Processなど、 Server全体の負荷状況を確認できます。

QUESTION 02

systemctlでnginxがfailedになっていました。 次に行う確認として適切なのはどれですか?

正解:A

systemctlで分かるのはServiceの状態です。 「なぜ停止したのか」を調べるためにログを確認します。

QUESTION 03

障害切り分けの考え方として最も適切なのはどれですか?

正解:C

障害対応では、 確認結果を使って正常な範囲を確定し、 原因候補を少しずつ絞っていきます。

YOUR SCORE 0 / 3

3問に挑戦してみましょう。

まとめ

01

Linux障害では 最初に症状と影響範囲を整理する

02

CPU・Memory・Disk・Service・Networkなど、 症状に合わせて確認対象を選ぶ

03

systemctlで状態を確認したら、 journalctlなどで 原因を調査する

04

Network障害では IP → Route → 疎通 → Port → DNS のように段階的に確認する

05

障害切り分けでは 正常な範囲を確定し、調査範囲を狭める ことが重要

06

コマンドを暗記するだけでなく 「何を確認したいのか」からコマンドを選ぶ

LINUX INTERMEDIATE COMPLETE

Linux中級講座はここまでです

ここまで、 ユーザー・グループ管理、所有者変更、プロセス、 Service、Log、Package、Disk、Network、cron、 障害切り分けまで学習してきました。

Linuxの基本コマンドを知る段階から、 「Serverで何が起きているのか」 「問題が起きたときにどこを確認すればよいのか」 を考えられるところまで Linuxの理解を広げてきました。

NEXT STEP

さらに実践的なLinuxスキルへ

ここから先は、 Shell Scriptによる自動化、 Linux Server構築、 Security、 より高度なTroubleshooting、 Container・Cloud環境など、 実践的なLinux学習へ進む段階です。

上級学習コンテンツについては、 現在より実践的に学習できる形を準備しています。

Linux上級 準備中
※ 上級コンテンツは現在準備中です。
LINUX INTERMEDIATE

Linux中級講座を振り返る

復習したい場合は、 Linux中級講座の一覧ページへ戻れます。

← Linux中級講座へ戻る
目次