Linuxのプロセスを「本当に理解した」日のこと|現役講師が語る親子関係・シグナル・STATの読み方

HOMEリナックスマスター.JP 公式ブログLinux学習ガイド > Linuxのプロセスを「本当に理解した」日のこと|現役講師が語る親子関係・シグナル・STATの読み方
宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「Linuxのプロセスって何となくわかるけど、いざ障害が起きると何をどう確認するといいかわからない」
そんな感覚を持ったまま、私もコマンドを叩き続けていた時期があった。
なぜこの作業は止まるのか、なぜkillしても死なないのか、なぜバックグラウンドに回すと速くなるのか。

この記事では、20年以上サーバーを運用してきた経験をもとに、「Linuxのプロセスを本当に理解した日」の話をします。
単なる概念解説ではなく、現場で使える思考の切り替え方と、理解した後に何が変わったかを正直にお伝えします。

この記事のポイント

・プロセスは「実行中のプログラム」だが、理解の本質は親子関係とシグナルにある
・ps aux と kill の組み合わせが「読めた」瞬間に現場対応速度が変わる
・プロセスを理解するとサービス停止の原因が「見える」ようになる
・SE時代の障害対応で気づいた、プロセス理解不足が招く2つの失敗パターン


Linuxのプロセスを「本当に理解した」日のこと|現役講師が語る親子関係・シグナル・STATの読み方
「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

「プロセスを知っている」と「プロセスが見える」は別物

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

Apacheのmaster processが、workerプロセスを子として生成している。
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プロセス

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"

STATカラムの「D」は「Disk I/O待ちで動けない」状態。この時にkill -9しても消えない。
ストレージ障害や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

kill -9 しても消えないプロセス:
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フリーズとゾンビを見分けられる
構造として理解している 障害時に仮説を立てて行動できる
プロセスの理解は、Linuxという世界の「見え方」を変える。
コマンドの暗記ではなく、動く仕組みへの理解を積み上げてほしい。

20年以上サーバーを運用してきた中で、それが最も現場に効いた学び方だったと確信している。

関連記事
ポートを確認するssコマンドとlsofコマンドの使い方
Linuxのエラーメッセージが読めれば障害対応は3倍速くなる

プロセスを「見える化」して、障害対応に自信を持てる技術者になりたくないですか?

プロセスの親子関係やシグナルが「なんとなく」のまま現場に出ると、障害対応の初動で詰まります。知識としてではなく、手を動かしながら身につけてほしい。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。


Linux無料マニュアル(図解60P) 名前とメールで30秒登録