この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
そんな感覚を持ったまま、私もコマンドを叩き続けていた時期があった。
なぜこの作業は止まるのか、なぜkillしても死なないのか、なぜバックグラウンドに回すと速くなるのか。
この記事では、20年以上サーバーを運用してきた経験をもとに、「Linuxのプロセスを本当に理解した日」の話をします。
単なる概念解説ではなく、現場で使える思考の切り替え方と、理解した後に何が変わったかを正直にお伝えします。
この記事のポイント
・プロセスは「実行中のプログラム」だが、理解の本質は親子関係とシグナルにある
・ps aux と kill の組み合わせが「読めた」瞬間に現場対応速度が変わる
・プロセスを理解するとサービス停止の原因が「見える」ようになる
・SE時代の障害対応で気づいた、プロセス理解不足が招く2つの失敗パターン
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
「プロセスを知っている」と「プロセスが見える」は別物
Linux学習を始めた頃、私もプロセスについては一通り勉強した。「実行中のプログラムのこと」「PIDという番号で管理される」「psコマンドで確認できる」。
でも、それを知っていたはずなのに、SE時代に現場でよく詰まった。
たとえば、Apacheを止めようとしてservice httpd stopを叩いたのに、80番ポートがまだ使われている。
Webアプリケーションのレスポンスが突然遅くなったが、どこを確認するといいかわからない。
バックグラウンドで動かしたはずのスクリプトがSSH切断後に消えている。
これらの現象は、すべて「プロセスの動き方を理解していなかった」ことが原因だった。
転換点になった「親子プロセス」の発見
プロセスへの理解が変わったのは、2003年頃の現場での出来事だった。あるWebシステムで、Apacheを再起動したのに古い設定が残ったままになる現象が起きた。
同僚と原因を調べるうちに、ps auxfコマンドを初めて意識的に使った。
# ps auxf でプロセスの親子関係をツリー表示 # apache2がmaster+workerの構造になっているのが見える $ ps auxf | grep -A 5 httpd root 1234 0.0 0.1 /usr/sbin/httpd -DFOREGROUND apache 1235 0.0 0.1 \_ /usr/sbin/httpd -DFOREGROUND apache 1236 0.0 0.1 \_ /usr/sbin/httpd -DFOREGROUND apache 1237 0.0 0.1 \_ /usr/sbin/httpd -DFOREGROUND
stopコマンドを叩いてもworkerが残ることがある——その理由が初めて「見えた」瞬間だった。
プロセスには「親」がいて、親が子を産む。親が死ねば子は孤児(orphan)になる。
この事実を知識としてではなく、自分の手で確認した時に、プロセスに対する感覚が変わった。
1. PIDだけでなく「PPIDを見る」習慣が変えたもの
それ以来、プロセスを確認する時はPPID(親プロセスID)も一緒に見るようにした。# PPIDを含めてプロセスを確認する $ ps -eo pid,ppid,user,cmd | grep httpd 1234 1 root /usr/sbin/httpd -DFOREGROUND 1235 1234 apache /usr/sbin/httpd -DFOREGROUND 1236 1234 apache /usr/sbin/httpd -DFOREGROUND # 結果の見方: # PPIDが1 → systemd(init)の直下 # PPIDが1234 → httpdのworkerプロセス
この関係を読めるようになると、「どのプロセスをどの順番で止めるか」が自然に分かる。
2. シグナルが「意思疎通の手段」だと気づいた瞬間
kill -9(SIGKILL)は強制終了だが、kill -1(SIGHUP)は「設定を再読み込みしろ」という意味を持つ。kill -15(SIGTERM)は「できれば綺麗に終了してほしい」という依頼だ。
これを知るまで、プロセスを止める=kill -9という発想しかなかった。
現場で先輩に「なんでいきなりkill -9なの?」と問われた時、答えられなかった。
シグナルはプロセスへの「メッセージ」であり、種類によって意味が違う。
この視点を持てたことで、サービスを止める判断が格段に丁寧になった。
# シグナルの使い分け # 設定再読み込み(サービス中断なし) $ kill -HUP 1234 # 丁寧に終了を依頼(SIGTERM) $ kill -TERM 1234 # または $ kill 1234 # 応答がない場合のみ強制終了(SIGKILL) $ kill -9 1234 # 使えるシグナル一覧を確認 $ kill -l
3. 「応答しないプロセス」の読み方が変わった
プロセスが固まって応答しない時、闇雲にkill -9するのではなく、まず状態を確認するようになった。# プロセスの状態(STATカラム)を確認 $ ps aux | awk '{print $8, $2, $11}' # R: 実行中 # S: 割り込み可能スリープ(IO待ちなど、正常) # D: 割り込み不可スリープ(IOで詰まっている危険サイン) # Z: ゾンビプロセス(親が回収していない) # T: 停止中 # ゾンビプロセスの確認 $ ps aux | awk '$8 ~ /^Z/ {print}' # STATがDのプロセス一覧 $ ps -eo stat,pid,cmd | grep "^D"
ストレージ障害やNFSの接続断が背景にある場合が多く、プロセスを止める前にIOの問題を解決する必要がある。
これを知らずにkill -9を何度も叩き続けた経験が、私には実際にある。
プロセスが「見える」ようになると何が変わるか
セミナーで3,100名以上を指導してきた中で、プロセスの理解度と障害対応速度には明確な相関があると感じている。・サービスが起動しない → 既存プロセスが残っていないかをまず確認できる
・メモリが足りない → どのプロセスが使っているかを特定してから判断できる
・CPUが高い → topやps auxでどのプロセスが原因かを絞り込んで判断できる
・SSH切断後にコマンドが止まる → nohupやscreenで制御できる
どれも、プロセスという概念が「なんとなくわかる」から「構造として読める」に変わった後に、自然にできるようになることだ。
初心者に伝えたい「プロセス学習の最短ルート」
理屈より先に、以下の3つのコマンドを自分の手で動かすことを勧めている。1. ps auxf で親子関係を目で見る
# f オプションでツリー形式表示(RHEL/CentOS系) $ ps auxf # ページャーと組み合わせる $ ps auxf | less # 特定サービスの親子関係だけ表示 $ ps auxf | grep -A 5 nginx
2. kill シグナルを段階的に試す
# テスト用に長時間スリープするプロセスを起動 $ sleep 300 & [1] 5678 # 直前のバックグラウンドジョブのPIDを確認 $ echo $! 5678 # まずSIGTERMで丁寧に終了要求 $ kill 5678 # 終了したか確認 $ ps aux | grep 5678
3. ゾンビプロセスを自分で作って観察する
# 簡単なゾンビ生成スクリプト(学習用) $ cat > /tmp/zombie_test.sh << 'EOF' #!/bin/bash # 子プロセスを起動して、親がwaitしないとゾンビになる ( exit 0 ) & CHILD_PID=$! echo "Child PID: $CHILD_PID" sleep 30 EOF $ bash /tmp/zombie_test.sh & # 別ターミナルで確認 $ ps aux | awk '$8 ~ /^Z/'
受講生に言い続けていることだが、プロセスに限らず「手を動かした後の理解」は圧倒的に定着が違う。
よくあるトラブルとプロセスの観点から見た対処法
プロセスを理解していれば、以下のトラブルは原因の仮説を立てやすくなる。・サービスが起動できない(Address already in use):
同じポートを使う古いプロセスが残っている可能性が高い。ps auxでプロセスを確認し、必要であれば停止する。
# 8080番ポートを使っているプロセスを確認 $ ss -tlnp | grep 8080 # または $ lsof -i :8080 # PIDを確認してから停止 $ kill -TERM 1234
STATがDの状態(Disk I/Oで詰まっている)はSIGKILLを受け付けない。
NFSのマウント断やストレージの問題など、IOの原因を先に解決する必要がある。
・SSH切断後にバックグラウンドジョブが止まる:
Bashのジョブ管理はセッションと紐付いているため、SSH切断でHUPシグナルが送られジョブが終了する。
nohupコマンドかscreenセッションを使うことで解決できる。
# SSH切断後も実行し続ける(nohupの場合) $ nohup ./long_process.sh > /tmp/out.log 2>&1 & # screenセッションを使う場合 $ screen -S mysession $ ./long_process.sh # Ctrl+A → D でデタッチ(SSH切断しても継続)
まとめ
| 理解のレベル | できること |
|---|---|
| 「プロセス」という言葉を知っている | psコマンドで一覧を出せる |
| 親子関係が見える | サービス停止の影響範囲を判断できる |
| シグナルの意味を知っている | kill -9以外の選択肢を使える |
| STATカラムが読める | IOフリーズとゾンビを見分けられる |
| 構造として理解している | 障害時に仮説を立てて行動できる |
コマンドの暗記ではなく、動く仕組みへの理解を積み上げてほしい。
20年以上サーバーを運用してきた中で、それが最も現場に効いた学び方だったと確信している。
関連記事
・ポートを確認するssコマンドとlsofコマンドの使い方
・Linuxのエラーメッセージが読めれば障害対応は3倍速くなる
プロセスを「見える化」して、障害対応に自信を持てる技術者になりたくないですか?
プロセスの親子関係やシグナルが「なんとなく」のまま現場に出ると、障害対応の初動で詰まります。知識としてではなく、手を動かしながら身につけてほしい。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:Linuxコマンドの覚え方|暗記より先にやるべき「体で覚える」練習法を現役講師が解説
- 前のページへ:Linux学習でつまずいたときに即使える立て直しの型|現役講師が実践する3ステップ
- この記事の属するカテゴリ:Linux学習ガイドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます