本文へスキップ
totonoe

ITを整える

中級

プロセスとシグナルを整える

= kill と kill -9 の違いを、手を動かして目で見て理解する

『kill って書いてあるのに、なぜプロセスが死なないの?』『kill -9 との違いは?』——このページでは、架空のプロセスにシグナルを送って挙動の違いを目で確かめ、ジョブ制御(fg/bg/Ctrl+Z)を疑似ターミナルで操作し、代表的なシグナルとPPID・forkの親子関係まで、手を動かしながら理解できます。すべてこの端末の中だけで完結し、どこにも送信しません(送信ゼロ)。

🔰 かんたんに言うと

動いているプログラム(プロセス)の止め方・待たせ方を、疑似ターミナルで安全に体験できます。

i

TLDR — 30秒で分かる

架空プロセスにkill(TERM=お願い)kill -9(KILL=即死)を送り比べて違いを体感。sleep 100 & → jobs → fg → Ctrl+Z → bgを疑似ターミナルで操作し、シグナル早見表とPPID・forkの親子関係も図解。

主な機能

  • ps風プロセス一覧からTERMとKILLを送り分け、後片付けの有無をアニメで比較
  • sleep 100 &→jobs→fg→Ctrl+Z→bgを疑似ターミナルのボタン操作で体験
  • フォアグラウンド/バックグラウンド/停止の3状態図で現在位置が動く
  • HUP/INT/QUIT/KILL/TERM/STOP/CONTのシグナル早見表(番号・意味・用途)
  • PPID・forkによる親子関係の1段図解、ゾンビ/オーファンもくわしくモードで解説
  • すべてブラウザ内・送信ゼロ

TRY 1

① ミニps体験 — kill と kill -9 は何が違う?

下のプロセス一覧から1つ選び、TERM(ふつうのkill)とKILL(kill -9)を送り比べてみましょう。TERMは『お願いして終了』、KILLは『問答無用で即死』。この違いが、実務でもっとも誤解されやすいポイントです。

🖥️ ps 風プロセス一覧 クリックで選択・送信ゼロ
PID PPID COMMAND 場所 STATUS 選択
101 1 nginx バックグラウンド running(実行中)
102 1 backup.sh バックグラウンド running(実行中)
103 1 vim フォアグラウンド running(実行中)
104 102 rsync バックグラウンド running(実行中)
🙂 待機中

上の一覧からプロセスを選び、TERMかKILLのボタンを押してください。

💡 実務の作法:まず kill(TERM)を送り、数秒待っても終了しなければ kill -9(KILL)という順番が定石です。いきなりKILLを使うのは、後片付けの機会を奪う「最終手段」であることを覚えておきましょう。

TRY 2

② ジョブ制御体験 — フォアグラウンド・バックグラウンド・停止

疑似ターミナルのボタンを順に押して、sleep 100 & → jobs → fg → Ctrl+Z → bg という一連の流れを体験しましょう。プロセスが『フォアグラウンド』『バックグラウンド』『停止中』の3状態を行き来する様子が図で見えます。

疑似ターミナル ボタン操作のみ・キー入力は不要(送信ゼロ)

$ このターミナルはボタン操作で進みます。下のボタンを順番に押してください。

フォア グラウンド バック グラウンド 停止中 Ctrl+Z:フォア→停止  bg:停止→バック(実行再開)  fg:バック/停止→フォア(実行再開) 現在の状態:(まだ何も実行していません)

💡 &(アンパサンド)を末尾に付けて実行すると、最初からバックグラウンドでジョブが始まります。Ctrl+Zはフォアグラウンドのジョブを一時停止してプロンプトを取り戻すためのショートカット、bgは停止中のジョブを実行再開しつつ裏に回す、fgは裏(または停止中)のジョブを表に戻す、という3つの操作を押さえれば、ターミナルを1つ占有せずに複数の作業を進められます。

REFERENCE

③ シグナル早見表

LPIC/LinuCで問われやすい代表的シグナルの番号・意味・用途です。番号は暗記より『KILL=9は最終手段、TERM=15がまず送るべきお願い』という関係で覚えると忘れにくくなります。

シグナル 番号 意味
SIGHUP(ハングアップ) 1 本来は「制御端末が切断された」ことを知らせるシグナル。
SIGINT(割り込み) 2 キーボードからの割り込み要求。Ctrl+Cを押したときに送られるのと同じシグナル。
SIGQUIT(終了+コアダンプ) 3 Ctrl+\ で送られるシグナル。INTに似ているが、既定動作でコアダンプ(メモリの内容をファイルに書き出す)を伴う。
SIGTERM(終了のお願い) 15 プロセスに「終了してください」とお願いするシグナル。killコマンドの既定(番号を省略した場合)はこれ。
SIGKILL(強制終了) 9 OSのカーネルが直接プロセスを止める、無視も後片付けもできないシグナル。
SIGSTOP(一時停止) 19 プロセスの実行を強制的に一時停止させる。KILLと同じく無視できない。
SIGCONT(再開) 18 停止中のプロセスの実行を再開させる。

💡 SIGHUP(HUP・1番)の慣習:本来は「端末が切断された」ことを知らせるシグナルですが、長年の運用慣習として多くのデーモン(nginxやsshd等)が「設定ファイルを再読み込みせよ」という意味で解釈するようになりました。ただしkillコマンドで直接HUPを送るとプロセスが終了してしまうケースもあるため、実務ではまず専用のreload系コマンド(systemctl reload 等)を優先します。

STRUCTURE

④ プロセスの親子 — PPIDとfork

Linuxのプロセスは、既存のプロセスが自分の複製を作る fork() によって生まれます。生まれた側を『子プロセス』、生んだ側を『親プロセス』と呼び、子は自分のPPID(親プロセスID)に親のPIDを記録します。

fork() backup.sh PID 102 rsync PID 104

上の例では、backup.sh(PID 102)が処理の途中で rsync(PID 104)を fork() し、子プロセスの PPID には親のPID「102」が記録されます。ps -ef などでPPID列を見れば、どのプロセスがどこから生まれたかを辿れます。

くわしく:ゾンビプロセスとオーファン(孤児)プロセスとは

ゾンビプロセス:子プロセスが終了しても、その終了ステータスを親プロセスが wait() で回収するまでは、プロセステーブルに「終了済みの抜け殻」として残り続けます。この状態を ps で見ると Z と表示されます。親がきちんと wait() を呼べば消えますが、親の実装が悪いと大量に溜まり、プロセステーブルを圧迫することがあります。

オーファン(孤児)プロセス:逆に、子より先に親プロセスが終了してしまった場合、残された子プロセスは「養子」としてPID 1(initやsystemd)に引き取られ、PPIDが1に付け替わります。孤児になったプロセス自体は正常に動作を続けられ、最終的にinit系プロセスがwait()して回収します。

📘 LPIC/LinuCで頻出の範囲です。実際のシグナルはプロセスが独自のハンドラを登録して挙動を変えられる(例:SIGTERMを一時的に無視して後片付け専用の処理をする等)ため、本ページの状態遷移は「まずTERMとKILLの違い」「ジョブ制御の基本」を掴むための簡略モデルです。

よくある質問

Q. プロセスとは何ですか?

A. プロセスとは、Linuxが実行中のプログラムを管理する単位です。プログラムを起動すると、OSはそれに一意の番号(PID/プロセスID)を割り当て、メモリやCPU時間などの資源を割り当てて動かします。1つのプログラムファイルから複数のプロセスが同時に起動されることもあり(例:ブラウザのタブごと)、`ps`コマンドで現在動いているプロセスの一覧(PID・状態・コマンド名など)を確認できます。

Q. kill と kill -9 は何が違いますか?

A. `kill`は既定でSIGTERM(15番)を送ります。これはプロセスに「終了してください」と**お願いする**シグナルで、プロセス側は受け取った後に保存処理や接続のクローズなど**後片付け**をしてから自分の意思で終了できます。一方`kill -9`はSIGKILL(9番)を送り、OSのカーネルが直接プロセスを停止させるため、プロセス自身は後片付けをする余地が一切ありません。挙動の違いは、本ページの「①ミニps体験」でTERMとKILLを送り比べると一目で分かります。

Q. なぜ、まずTERMを送るべきなのですか?

A. TERM(SIGTERM)はプロセスに後片付けの機会を与えるため、開いているファイルの保存、一時ファイルの削除、ネットワーク接続の正常なクローズなどを行ってから終了できます。対してKILL(SIGKILL)はこれらを一切スキップして即座に停止させるため、書きかけのファイルが壊れたり、一時ファイルの残骸が残ったりするリスクがあります。そのため実務では「まずkill(TERM)を送り、数秒待っても終了しなければkill -9(KILL)を使う」という順序が定石とされています。

Q. Ctrl+CとCtrl+Zの違いは何ですか?

A. Ctrl+Cはフォアグラウンドのプロセスに**SIGINT(割り込み)**を送り、多くの場合プロセスはそのまま**終了**します。一方Ctrl+Zは**SIGTSTP相当の停止シグナル**を送り、プロセスを**終了させずに一時停止**させてプロンプトを取り戻します。停止しただけなので、後から`fg`(フォアグラウンドに戻す)や`bg`(バックグラウンドで再開する)でプロセスの実行を再開できます。本ページの「②ジョブ制御体験」で、Ctrl+Z→bg→fgの流れを実際に操作して確認できます。

Q. コマンドの末尾に付ける「&」とnohupは何が違いますか?

A. 末尾の`&`は、コマンドを**バックグラウンドで実行し、プロンプトをすぐ返す**ための記法です(例:`sleep 100 &`)。ただしターミナルを閉じるとSIGHUPが送られ、多くの場合プロセスも一緒に終了してしまいます。`nohup`はこのSIGHUPを**無視する**ようにしてからコマンドを起動する仕組みで、`nohup command &`のように組み合わせることで、ターミナルを閉じたりログアウトしたりしてもプロセスを動かし続けられます。長時間かかる作業をリモートサーバーで実行する際によく使われる組み合わせです。

Q. ゾンビプロセスとは何ですか?

A. 子プロセスが終了した後も、その終了ステータスを親プロセスが`wait()`で回収するまでの間、プロセステーブルに「終了済みの抜け殻」として残り続ける状態を指します。`ps`コマンドではステータスが`Z`と表示されます。親プロセスがきちんと`wait()`を呼べば自然に消えますが、親の実装に不備があると大量に溜まり、プロセステーブルの空きを圧迫することがあります。よく似た用語に「オーファン(孤児)プロセス」があり、こちらは逆に親が子より先に終了した場合に、子プロセスがPID 1(init/systemd)に引き取られる状態を指します。本ページの「④プロセスの親子」内の『くわしく』で詳しく解説しています。

Q. このページの操作はどこかに送信されますか?

A. いいえ。プロセス一覧・シグナル送信・ジョブ制御の操作はすべて、あなたのブラウザの中だけで完結する純粋なJavaScript(TypeScript)の計算です。サーバーへの通信は一切発生しません(送信ゼロ)。実在のプロセスを操作しているわけではなく、学習用の架空データを使った疑似体験です。

入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。

RELATED TOOLS

続けて整える

KOINOBORI ECOSYSTEM

私たちが運営するサイト