「アプリケーションがフリーズして操作できない」「バックグラウンドで動き続けているプロセスを止めたい」——Linuxでこうした場面に対応するための基本コマンドがkillです。
killコマンドは名前の通り「プロセスを終了する」コマンドですが、強制終了だけでなく、様々なシグナルを送ることでプロセスの動作を細かく制御できます。この記事では、基本的な使い方からシグナルの種類・プロセス検索との組み合わせ・注意点まで体系的に解説します。
killコマンドとは

基本概念と役割
killコマンドは、Linuxで動作しているプロセスにシグナルを送信するコマンドです。最も一般的な用途はプロセスの終了ですが、厳密には「プロセスを殺す(kill)」だけでなく、「シグナルを送信する」ことが本来の役割です。
📌 この記事の手順はUbuntu 20.04/22.04・CentOS 7/8・RHEL系のLinux環境を対象としています。
プロセスID(PID)を指定して終了する仕組み
Linuxでは起動しているすべてのプロセスに一意のPID(プロセスID)が割り当てられます。killコマンドはこのPIDを指定してシグナルを送信します。
# 基本的な構文
kill [オプション] PID
# PIDの確認(実行中のプロセス一覧を表示)
ps aux | grep nginx
プロセス管理の基本ツールとしての位置付け
killはプロセス管理コマンド群の中核をなすコマンドです。関連コマンドとの役割分担は以下の通りです。
| コマンド | 役割 |
|---|---|
kill |
PIDを指定してシグナルを送信 |
pkill |
プロセス名でシグナルを送信 |
killall |
プロセス名と一致するすべてのプロセスを終了 |
ps |
実行中のプロセスとPIDを確認 |
pgrep |
プロセス名からPIDを取得 |
top / htop |
プロセスをリアルタイムで監視 |
killコマンドの基本的な使い方

プロセスIDを指定して終了
kill PID の基本例
最もシンプルなkillコマンドの使い方です。シグナルを指定しない場合、デフォルトでSIGTERM(15)が送信され、プロセスに正常終了を促します。
# 基本的な終了コマンド(SIGTERM送信)
kill 1234
# 複数のPIDを一度に指定
kill 1234 5678 9012
# 終了後にプロセスが消えたか確認
ps aux | grep 1234
killコマンドの基本的な使い方の詳細はこちらの記事も参考になります。
現在のユーザー権限で終了可能なプロセス
一般ユーザーは自分が起動したプロセス(同じUIDを持つプロセス)にのみシグナルを送れます。他のユーザーのプロセスや、システムプロセスへのkillは権限エラーになります。
# 自分のプロセスを確認
ps aux | grep $(whoami)
# 権限不足の場合のエラー例
kill 1
# -bash: kill: (1) - Operation not permitted
sudoで管理者権限が必要な場合
他のユーザーが起動したプロセスやシステムデーモンを終了する場合はsudo権限が必要です。
# sudo権限でkillを実行
sudo kill 1234
# rootとして実行中のNginxを停止する場合
sudo kill $(pgrep nginx)
# 権限を確認してからkillする
ps aux | grep nginx
# nginx 1234 0.0 0.1 ... nginx: master process
sudo kill 1234
sudo killを実行する前に、対象のPIDが正しいかを必ず確認してください。誤ったPIDにsudo killを実行すると、重要なシステムプロセスを終了してしまう危険があります。
シグナルを指定したkillコマンド

SIGTERM(15)で通常終了
SIGTERMはkillコマンドのデフォルトシグナルです。プロセスに「終了してください」というリクエストを送ります。プロセスはこのシグナルを受け取ると、処理中のデータを保存してからクリーンに終了します。
# SIGTERMを明示的に送信(以下3つは同じ意味)
kill 1234
kill -15 1234
kill -SIGTERM 1234
kill -s SIGTERM 1234
SIGTERMはプロセスが無視できるシグナルです。フリーズしているプロセスや、シグナルハンドラーでSIGTERMを無視するように設定されたプロセスには効果がありません。
SIGKILL(9)で強制終了
SIGKILLはプロセスを問答無用で強制終了します。OSカーネルが直接プロセスを終了させるため、プロセスはシグナルを無視・ブロック・ハンドリングできません。
# SIGKILL(強制終了)の送信(以下2つは同じ意味)
kill -9 1234
kill -SIGKILL 1234
SIGKILL(-9)はプロセスに後処理の機会を与えません。一時ファイルが残る・ファイルシステムの整合性が崩れる・データが失われるリスクがあります。SIGTERMで終了しない場合の最終手段として使用してください。
その他のシグナル一覧(SIGHUP, SIGINTなど)
killで送信できる主なシグナルの一覧です。
| シグナル名 | 番号 | 主な用途 |
|---|---|---|
| SIGHUP | 1 | 設定ファイルの再読み込み(デーモンの再起動) |
| SIGINT | 2 | 割り込み(Ctrl+Cと同等) |
| SIGQUIT | 3 | コアダンプを生成して終了 |
| SIGTERM | 15 | 通常終了(デフォルト) |
| SIGKILL | 9 | 強制終了(無視不可) |
| SIGSTOP | 19/17 | プロセスを一時停止(無視不可) |
| SIGCONT | 18/25 | 停止したプロセスを再開 |
| SIGUSR1 | 10 | ユーザー定義シグナル1(アプリ固有の処理) |
| SIGUSR2 | 12 | ユーザー定義シグナル2(アプリ固有の処理) |
# 使用可能なシグナル一覧を表示
kill -l
# SIGHUPでNginxの設定を再読み込み(再起動なし)
sudo kill -1 $(pgrep nginx)
# または
sudo kill -HUP $(pgrep nginx)
シグナル指定の書き方
kill -s SIGKILL PID または kill -9 PID
シグナルを指定する方法は複数あります。
# 方法1: 番号で指定
kill -9 1234
# 方法2: シグナル名で指定
kill -SIGKILL 1234
# 方法3: -sオプションでシグナル名を指定
kill -s SIGKILL 1234
# 方法4: SIG接頭辞なしで指定
kill -KILL 1234
# すべて同じ動作(SIGKILLの送信)
プロセスの検索とkillの併用
psコマンドでPIDを確認
psコマンドで実行中のプロセスとそのPIDを確認します。psコマンドとkillを組み合わせたプロセス管理の詳細はこちらの記事も参考になります。
# 全プロセスを表示
ps aux
# 特定のプロセス名でフィルタリング
ps aux | grep nginx
# 出力例
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
# root 1234 0.0 0.1 55680 2344 ? Ss 10:00 0:00 nginx: master
# PID列(2列目)の値を確認してkillに使用
kill 1234
pgrepコマンドでプロセス名からPIDを取得
pgrepはプロセス名からPIDを直接取得できるコマンドです。psとgrepの組み合わせより簡潔に書けます。
# プロセス名からPIDを取得
pgrep nginx
# 出力例: 1234
# 詳細情報とともに表示(-lオプション)
pgrep -l nginx
# 出力例: 1234 nginx
# pgrepの結果をkillに直接渡す
kill $(pgrep nginx)
# 完全一致で検索(-xオプション)
pgrep -x nginx
killとgrepを組み合わせた終了方法
psとgrepとkillを組み合わせてプロセスを検索・終了する実践的なパターンです。
# ps + grep + awkでPIDを抽出してkill
ps aux | grep nginx | grep -v grep | awk '{print $2}' | xargs kill
# 解説:
# grep -v grep: grepコマンド自体をフィルタリング
# awk '{print $2}': 2列目(PID)のみ抽出
# xargs kill: 抽出したPIDをkillに渡す
# pkillを使うとさらに簡潔に書ける
pkill nginx # SIGTERMで終了
pkill -9 nginx # SIGKILLで強制終了
# killallを使う方法
killall nginx # プロセス名に一致するすべてを終了
killall -9 nginx # 強制終了
Tips: pkillとkillallはプロセス名でシグナルを送れるため、PIDを調べる手間が省けます。ただし同名のプロセスが複数ある場合は全件に送信されるため、対象を絞る場合はpgrep→killの流れを使いましょう。
killコマンドの注意点
重要なシステムプロセスを誤って終了しない
PID 1はinitまたはsystemd(Linuxの最初のプロセス)です。このプロセスにSIGKILLを送るとシステム全体がクラッシュします。一般的にはカーネルが保護していますが、意図しない操作には注意が必要です。
# 特に注意が必要なプロセス
PID 1 → init/systemd(絶対に終了しない)
PID 2 → kthreadd(カーネルスレッド)
# 実行前に対象プロセスを必ず確認
ps aux | grep PID番号
# 不明なPIDへの操作前に詳細を確認
cat /proc/1234/cmdline # プロセスのコマンドを確認
ls -la /proc/1234/exe # 実行ファイルのパスを確認
sudo権限が必要な場合の扱い
他のユーザーのプロセスやシステムデーモンを終了する場合はsudoが必要です。sudoを使う場合は特に対象PIDの確認を慎重に行います。
# 安全な手順
# 1. まず対象プロセスを確認
sudo ps aux | grep サービス名
# 2. PIDが正しいことを確認
sudo cat /proc/対象PID/cmdline
# 3. SIGTERMから試す
sudo kill -15 対象PID
# 4. 終了しない場合のみSIGKILL
sudo kill -9 対象PID
kill後にプロセスが残るケースと対処
SIGTERMを送っても以下の理由でプロセスが残ることがあります。killコマンドでプロセスが終了しない場合の対処法はこちらの記事も参考になります。
- プロセスがSIGTERMを無視するよう設定されている
- プロセスがフリーズしてシグナルを処理できない状態になっている
- ゾンビプロセス(すでに終了しているが親プロセスが回収していない)
# kill後にプロセスを確認
ps aux | grep 対象PID
# ゾンビプロセスの確認(STATがZのプロセス)
ps aux | grep 'Z'
# ゾンビプロセスは親プロセスを終了することで解消
pstree -p | grep ゾンビのPID # 親PIDを確認
kill -9 親PID
強制終了は最終手段として使用
SIGKILL(-9)を使う場面の判断基準です。
| 状況 | 推奨する対応 |
|---|---|
| 通常のプロセス終了 | kill(SIGTERM) |
| SIGTERMで終了しない場合 | 数秒待ってから再度SIGTERM → それでも残る場合SIGKILL |
| 完全にフリーズしている | kill -9(最終手段) |
| データベース・ファイルサーバー | 専用の停止コマンドを使う(systemctl stop など) |
killコマンドの応用例
特定ユーザーのプロセスを一括終了
特定ユーザーが起動したすべてのプロセスを終了する場合の方法です。killコマンドの応用的な使い方の実例はこちらの記事も参考になります。
# 特定ユーザー(testuser)のすべてのプロセスを終了
pkill -u testuser
# 特定ユーザーのプロセスをSIGKILLで強制終了
pkill -9 -u testuser
# ユーザーのPID一覧を確認
pgrep -u testuser
# ユーザーのプロセス詳細を確認
ps -u testuser
デーモンやバックグラウンドプロセスの停止
Webサーバー・データベースなどのデーモンプロセスの停止には、killより専用コマンドを優先しますが、応答しない場合はkillを使います。
# 推奨: systemctlで正常停止(データ保護)
sudo systemctl stop nginx
sudo systemctl stop mysql
# systemctlが効かない場合: SIGTERMで停止
sudo kill -15 $(pgrep nginx)
# バックグラウンドジョブの停止
jobs # バックグラウンドジョブ一覧を表示
# [1]+ Running long_process.sh &
# バックグラウンドジョブのPIDを確認してkill
kill %1 # ジョブ番号を指定(%1はジョブ番号1を意味)
# または
kill $(jobs -p) # すべてのバックグラウンドジョブを終了
スクリプト内での自動プロセス管理
シェルスクリプトでプロセスを自動管理するパターンです。
#!/bin/bash
# プロセスを安全に終了するスクリプト例
TARGET_PROCESS="myapp"
TIMEOUT=10 # 秒数
# プロセスが動いているか確認
if pgrep -x "$TARGET_PROCESS" > /dev/null; then
echo "${TARGET_PROCESS}を終了します(SIGTERM)"
pkill -SIGTERM "$TARGET_PROCESS"
# タイムアウトまで待機
ELAPSED=0
while pgrep -x "$TARGET_PROCESS" > /dev/null && [ $ELAPSED -lt $TIMEOUT ]; do
sleep 1
ELAPSED=$((ELAPSED + 1))
echo "待機中... ${ELAPSED}秒"
done
# まだ残っている場合はSIGKILL
if pgrep -x "$TARGET_PROCESS" > /dev/null; then
echo "タイムアウト。SIGKILLで強制終了します"
pkill -SIGKILL "$TARGET_PROCESS"
else
echo "${TARGET_PROCESS}が正常に終了しました"
fi
else
echo "${TARGET_PROCESS}は実行されていません"
fi
ログ出力やエラーハンドリングとの併用
#!/bin/bash
# PIDファイルを使ったプロセス管理
PID_FILE="/var/run/myapp.pid"
LOG_FILE="/var/log/myapp.log"
stop_process() {
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
# PIDが有効かどうかを確認
if kill -0 "$PID" 2>/dev/null; then
echo "$(date): プロセス${PID}を停止します" >> "$LOG_FILE"
kill -15 "$PID"
rm -f "$PID_FILE"
echo "$(date): 停止完了" >> "$LOG_FILE"
else
echo "$(date): PIDファイルが古いため削除します" >> "$LOG_FILE"
rm -f "$PID_FILE"
fi
else
echo "$(date): PIDファイルが見つかりません" >> "$LOG_FILE"
fi
}
stop_process
まとめ
killコマンドはLinuxでプロセスを終了する基本ツール
killコマンドはPIDを指定してプロセスにシグナルを送信するLinuxの基本コマンドです。デフォルトのSIGTERMによる通常終了から、強制終了のSIGKILL、設定リロードのSIGHUPまで、シグナルによって用途が異なります。
シグナル指定で安全に終了させる
- 通常は
kill PID(SIGTERM)から試す - SIGTERMで終了しない場合のみ
kill -9 PID(SIGKILL)を使う - デーモンの設定リロードには
kill -1 PID(SIGHUP)が有効 - 実行前に必ず
ps auxやcat /proc/PID/cmdlineで対象を確認する - sudo killは特に慎重に実行し、重要なシステムプロセスを誤って終了しない
検索コマンドと併用して効率的にプロセス管理
killコマンドはps・pgrep・pkill・killallなどのコマンドと組み合わせることで真価を発揮します。特にkill $(pgrep プロセス名)のパターンと、スクリプトでSIGTERM→待機→SIGKILL の順で安全に終了を試みる処理を組み合わせることで、本番環境でも安全で効率的なプロセス管理が実現します。

