サーバー運用をしていると、暴走したプロセスや応答しなくなったサービスを強制的に停止しなければならない場面が必ず出てきます。
この記事では、kill コマンドによるプロセス終了の基本から、killall・pkill との使い分け、シグナルの種類と選び方、そして現場で「やってはいけない」操作まで実践的に解説します。
・killコマンドでプロセスを終了させる基本構文とシグナルの意味
・kill -9(SIGKILL)とkill -15(SIGTERM)の違いと正しい使い分け
・killallコマンドで同名プロセスをまとめて終了させる方法
・pkillコマンドでプロセス名のパターン指定で終了させる方法
・pgrepでプロセスIDを取得してkillと組み合わせる実践的な使い方
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
kill コマンドとは? ~ プロセス終了の仕組み
kill コマンドは、指定したプロセスに「シグナル(信号)」を送るコマンドです。「kill」という名前から「強制終了専用」と思われがちですが、実際にはプロセスへさまざまな指示を送るための汎用コマンドです。再起動の指示(HUP)や一時停止(STOP)なども kill コマンドで行います。
シグナルを省略した場合はデフォルトで SIGTERM(シグナル番号15)が送られ、プロセスに「正常に終了してください」と通知します。プロセスが SIGTERM を無視して終了しない場合に、SIGKILL(シグナル番号9)で強制終了させるのが基本的な流れです。
基本的な使い方 ~ PID を指定してプロセスを終了する
1. PID を確認する
まず、終了させたいプロセスの PID(プロセスID)を確認します。# ps aux で対象プロセスを探す $ ps aux | grep httpd root 1234 0.0 0.5 23456 5678 ? Ss 10:00 0:00 /usr/sbin/httpd apache 1235 0.0 0.3 23456 3456 ? S 10:00 0:00 /usr/sbin/httpd apache 1236 0.0 0.3 23456 3456 ? S 10:00 0:00 /usr/sbin/httpd
2. SIGTERM で正常終了を試みる
最初は必ず SIGTERM(デフォルト)で終了を試みてください。# シグナルを省略すると SIGTERM(15)が送られる $ kill 1234 # 明示的に SIGTERM を指定する場合 $ kill -15 1234 $ kill -SIGTERM 1234
3. SIGKILL で強制終了する
SIGTERM を送っても数秒待ってプロセスが残っている場合は、SIGKILL で強制終了します。# SIGKILL(9)で強制終了 $ kill -9 1234 $ kill -SIGKILL 1234 # 終了したか確認 $ ps aux | grep httpd | grep -v grep
【重要】いきなり kill -9 を使ってはいけない理由
現場でよくある間違いが「とりあえず kill -9」です。SIGKILL はプロセスの終了処理を一切行わずに即座に停止させます。そのため、以下のリスクがあります。・一時ファイルが残る:ロックファイルや PID ファイルが削除されず、次回起動時にエラーになる
・データが破損する:書き込み中のファイルやデータベースのトランザクションが中途半端な状態で残る
・子プロセスがゾンビ化する:親プロセスが後処理なしで消えると、子プロセスがゾンビプロセスになることがある
鉄則は「まず SIGTERM → 数秒待つ → それでも終了しなければ SIGKILL」の順番です。
よく使うシグナル一覧
kill コマンドで指定できる主要なシグナルを整理します。| 番号 | シグナル名 | 動作 | 用途 |
|---|---|---|---|
| 1 | SIGHUP | ハングアップ | 設定ファイル再読み込み(デーモンの再起動) |
| 2 | SIGINT | 割り込み終了 | Ctrl+C と同じ動作 |
| 9 | SIGKILL | 強制終了 | プロセスが応答しない場合の最終手段 |
| 15 | SIGTERM | 正常終了 | kill のデフォルト。まずこれを使う |
| 18 | SIGCONT | 再開 | SIGSTOP で停止したプロセスを再開 |
| 19 | SIGSTOP | 一時停止 | プロセスを一時停止(終了はしない) |
kill -l で確認できます。# 使用可能なシグナル一覧を表示 $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM ...
killall・pkill との使い分け
kill コマンドは PID を指定する必要がありますが、プロセス名で指定したい場合は killall や pkill を使います。1. killall ~ プロセス名で一括終了
killall は、指定したプロセス名に完全一致するプロセスをすべて終了させます。# httpd プロセスをすべて終了 $ killall httpd # 確認してから終了(-i オプション) $ killall -i httpd Kill httpd(1234) ? (y/n) y Kill httpd(1235) ? (y/n) y # SIGKILL で強制終了 $ killall -9 httpd
2. pkill ~ 部分一致やユーザー指定で柔軟に終了
pkill は、プロセス名の部分一致や、実行ユーザーを条件にしてプロセスを終了できます。# プロセス名に「http」を含むプロセスをすべて終了 $ pkill http # 特定ユーザーのプロセスをすべて終了 $ pkill -u apache # 特定ユーザーの特定プロセスを終了 $ pkill -u apache httpd # 終了前に対象を確認したい場合は pgrep で確認 $ pgrep -a httpd 1234 /usr/sbin/httpd -DFOREGROUND 1235 /usr/sbin/httpd -DFOREGROUND
3. どのコマンドを使うべきか
・PID がわかっている場合:kill PID が最も確実・同じ名前のプロセスを一括終了したい場合:
killall プロセス名 が便利・プロセス名の一部やユーザーで絞り込みたい場合:
pkill が柔軟本番サーバーでは、意図しないプロセスを巻き込まないよう、まず
pgrep -a プロセス名 で対象を確認してから kill 系コマンドを実行するのが安全です。実務で使えるTips
1. 設定ファイル変更後のデーモン再読み込み(SIGHUP)
Apache や Nginx などのデーモンは、SIGHUP を送ると設定ファイルを再読み込みします。サービスを停止せずに設定を反映できるため、運用中のサーバーで重宝します。# httpd の PID を確認して SIGHUP を送る $ cat /var/run/httpd/httpd.pid 1234 $ kill -HUP 1234 # または pkill を使う $ pkill -HUP httpd
2. バックグラウンドジョブの終了
バックグラウンドで実行中のジョブは、ジョブ番号を使って終了させることもできます。# バックグラウンドジョブを確認 $ jobs [1]+ Running tail -f /var/log/messages & [2]- Running top & # ジョブ番号で終了(%の後にジョブ番号) $ kill %1
3. 複数の PID をまとめて終了する
kill コマンドは複数の PID をスペース区切りで指定できます。# 複数の PID をまとめて終了 $ kill 1234 1235 1236
トラブルシュート ~ プロセスが終了できない場合
「Operation not permitted」が出た場合
自分が所有していないプロセスを終了しようとすると、このエラーが出ます。root 権限(sudo)で実行してください。# 一般ユーザーで実行するとエラー $ kill 1234 -bash: kill: (1234) - Operation not permitted # sudo で実行 $ sudo kill 1234
「No such process」が出た場合
指定した PID のプロセスが既に終了している場合に表示されます。ps aux で現在のプロセス一覧を再確認してください。$ kill 9999 -bash: kill: (9999) - No such process # PID を再確認 $ ps aux | grep httpd | grep -v grep
kill -9 でも終了しないプロセス(D状態)
ps aux の STAT 列が「D」(割り込み不可のスリープ状態)のプロセスは、カーネル内部でI/O待ちをしているため SIGKILL でも終了できません。この状態は NFS マウントの応答待ちやディスクI/Oの障害で発生することが多く、原因となっている I/O の問題を解消するか、最終手段としてシステムの再起動が必要です。
ゾンビプロセス(Z状態)の対処
STAT 列が「Z」のゾンビプロセスは、既に実行を終了していますが親プロセスが終了状態を回収していない状態です。ゾンビプロセス自体に kill は効きません。対処法は親プロセスに SIGCHLD を送るか、親プロセスを終了させることです。
# ゾンビプロセスの親 PID(PPID)を確認 $ ps -eo pid,ppid,stat,cmd | grep Z 5678 5670 Z [defunct] # 親プロセスに SIGCHLD を送る $ kill -SIGCHLD 5670
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| PID を指定して正常終了 | kill PID |
| PID を指定して強制終了 | kill -9 PID |
| 設定ファイルの再読み込み | kill -HUP PID |
| プロセス名で一括終了 | killall プロセス名 |
| プロセス名の部分一致で終了 | pkill プロセス名 |
| 特定ユーザーのプロセスを終了 | pkill -u ユーザー名 |
| 終了対象を事前確認 | pgrep -a プロセス名 |
| 使用可能なシグナル一覧 | kill -l |
プロセス管理で詰まったことはありませんか?
killコマンドを正しく使いこなすことは、Linuxサーバー管理の基本スキルです。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら

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