Linuxサーバー運用中、以下のような状況に遭遇したことはないでしょうか。
- systemctl status は active (running)
- プロセスも存在している
- それなのにレスポンスが返らない
この状態は一見すると「正常」に見えますが、
実際には処理がどこかで止まっている
ことがほとんどです。
本記事では、
- サービスが「生きているように見える」理由
- どこで止まっているかを切り分ける手順
- どうなれば解決と判断できるか
を、Linux実務でそのまま使える調査フローとして解説します。
目次
まず前提:プロセスがある ≠ 正常稼働
Linuxでは、
- プロセスが存在する
- systemdがrunningと表示する
だけで、
そのプロセスが仕事をしている保証はありません。
以下のような状態でも、 サービスは「落ちていない」扱いになります。
- I/O待ちで完全に止まっている
- ロック待ちで進めない
- 外部通信待ちで固まっている
Step1:systemctlで「見た目の状態」を確認
systemctl status サービス名
ここで確認するポイントは、
- active (running) になっているか
- Main PID が存在しているか
- 再起動ループに入っていないか
active であれば、 「systemd的には問題なし」というだけです。
Step2:本当に処理が進んでいるかを確認
CPUを使っているか
top -Hp PID
以下の場合は要注意です。
- CPU使用率がほぼ0
- スレッド数はあるが動いていない
CPUを使っていない = 暇、ではなく、 待たされている可能性があります。
プロセス状態を見る
ps -o pid,stat,cmd -p PID
特に見るべきは STAT です。
- D:I/O待ち(ほぼ停止)
- S:スリープ中
D 状態が続く場合、 外から止めることはほぼ不可能です。
Step3:I/O待ち・ブロックを疑う
vmstat 1
以下が揃っていれば、
- b(Blocked)が増えている
- wa(I/O wait)が出ている
サービスが動いていない原因は ディスクI/O待ちです。
この場合、サービス自体を再起動しても 根本解決にはなりません。
Step4:ログは出ているか(journalctl)
journalctl -u サービス名 --since "YYYY-MM-DD HH:MM"
見るべきポイントは、
- エラーが出ていないか
- ログが途中で止まっていないか
ログが出ていない場合、
- 処理が入口で詰まっている
- 外部依存で待っている
可能性が高くなります。
Step5:ネットワーク・外部依存を疑う
以下のケースでは、 サービスは「落ちていないが動かない」状態になります。
- 外部API応答待ち
- DBロック待ち
- DNS名前解決待ち
確認例:
ss -antp | grep PID
接続が
- ESTABLISHED のまま動かない
- SYN-SENT で止まっている
場合、通信待ちが原因です。
やってはいけない対処
- 原因不明のまま再起動を繰り返す
- 「そのうち治る」と放置する
これらは、
問題を隠すだけで再発を招きます。
どうなれば「解決」と判断できるか
以下が揃えば解決です。
- 処理が止まっていた原因が特定できた
- I/O・通信待ちが解消された
- CPU・ログが正常に動き出した
単に再起動して直っただけでは、 解決とは言えません。
まとめ
- running表示でも中身は止まっていることがある
- CPU未使用=正常ではない
- vmstat・journalctl・ss が切り分けの軸
- 「どこで待っているか」を見つけるのが最重要
サービスが落ちていないのに動かない場合、
原因は必ず「待ち」です。
正しい順序で見れば、 必ず辿り着けます。
あわせて読みたい


journalctlの実務的な使い方まとめ
systemd環境のLinuxでは、ログ確認といえば journalctl が基本です。 しかし実際の現場では、 ログが多すぎて追えない 何を見れば原因が分かるのか分からない 結局grep…
あわせて読みたい


systemdサービスが突然再起動する原因とログの追い方
Linux運用中、systemd管理のサービスが 勝手に再起動している 停止していないのにPIDが変わっている ユーザー操作の記録がない といった事象に遭遇することがあります。…
あわせて読みたい


CPU idleが高いのに遅い原因
サーバーが遅いと感じて確認すると、 CPU idle が高い CPU使用率も低い それでもレスポンスが悪い この状態は、 Linux運用で最も混乱しやすいパターンの一つです。 本記…
