この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:6
ページ更新者:T
更新日時:2026-06-11 07:10:02

タイトル: kill プロセスを終了させる
SEOタイトル: Linux kill コマンド完全ガイド — シグナル/pkill/killall

この記事の要点
  • kill PID でプロセスにシグナル送信 (デフォルト SIGTERM = 終了要求)
  • kill -9 PID = SIGKILL = 強制終了 (応答しないプロセス専用、後始末されない)
  • 名前で殺す: killall プロセス名 / pkill -f パターン
  • プロセス検索: ps aux | grep / pgrep -af / top
  • Windows: taskkill /F /PID 1234 / taskkill /F /IM xxx.exe

kill コマンドの基本

名前から「殺す」とつい連想しますが、実際はプロセスにシグナルを送るコマンドです。デフォルトは SIGTERM (15)「お願いだから終了して」という丁寧な要求。プロセス側は終了処理 (DB クローズ、テンポラリファイル削除など) を行ってから終わります。

# PID を指定して SIGTERM 送信
kill 1234

# = 明示的指定
kill -SIGTERM 1234
kill -15 1234
kill -TERM 1234

# 強制終了 (SIGKILL)
kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

# 複数 PID 同時
kill 1234 5678 9012

# シグナル一覧
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 ...

主なシグナル一覧

番号名前意味キャッチ可
1SIGHUPハングアップ。多くのデーモンは設定再読込として使う
2SIGINT割り込み (Ctrl+C)
3SIGQUIT中止 (Ctrl+\)、コアダンプ生成
9SIGKILL強制終了。プロセスは抵抗不可× (絶対)
10SIGUSR1ユーザ定義 1。アプリ独自用途 (ログローテーション等)
12SIGUSR2ユーザ定義 2
15SIGTERM終了要求。kill デフォルト。後始末させる
17/19SIGSTOP一時停止 (Ctrl+Z 相当の SIGTSTP もある)×
18/19SIGCONT一時停止解除

SIGTERM と SIGKILL の使い分け

項目SIGTERM (15)SIGKILL (9)
意味「終了してね」(丁寧)「即殺す」(問答無用)
キャッチプロセスが受け取って処理カーネルが即終了
後始末DB クローズ / 一時ファイル削除あり後始末されない
使うべきまず最初に試すSIGTERM で 30秒待っても死なないとき
副作用少ないデータ破損 / ファイル断片化

原則: いきなり -9 はやめるkill PID → 待つ → 死ななければ kill -9 PID

プロセス検索: ps / pgrep / top

ps aux | grep

# Apache を探す
ps aux | grep apache
# www-data  1234  0.5  2.0  ...  apache2
# www-data  1235  0.3  1.8  ...  apache2

# grep 自体が含まれるのを除外
ps aux | grep [a]pache

# プロセスツリー表示
ps auxf
# または
ps -ejH
pstree -p

pgrep / pkill (パターン検索 + kill 統合)

# パターン一致する PID を表示
pgrep nginx
# 1234
# 1235

# 詳細表示 (名前 + 引数)
pgrep -af nginx
# 1234 nginx: master process /usr/sbin/nginx
# 1235 nginx: worker process

# プロセス名フル一致 (デフォルトは部分一致)
pgrep -x nginx

# ユーザ指定
pgrep -u www-data nginx

# 親 PID で
pgrep -P 1234     # PID 1234 の子プロセス

top / htop でインタラクティブに

top
# 表示中: k キー → PID 入力 → シグナル番号入力 で kill

htop
# F9 (Kill) → シグナル選択 → Enter
# F5 でツリー表示

# CPU 使用率順
top -o %CPU
# メモリ使用率順
top -o %MEM

killall: プロセス名で一括 kill

# nginx という名前のプロセスをすべて kill
killall nginx

# 強制
killall -9 nginx

# 確認モード (対話的)
killall -i nginx
# Kill nginx(1234) ? (y/N) y

# ユーザ指定
killall -u www-data nginx

# 完全一致のみ
killall -e nginx

pkill: パターンで kill

# nginx を含むプロセス
pkill nginx

# 完全引数一致 (-f は引数も含めてマッチ)
pkill -f "python my_script.py"

# 強制
pkill -9 -f "tomcat"

# ユーザ指定
pkill -u alice firefox

# 親プロセス指定
pkill -P 1234

# シグナル指定
pkill -SIGUSR1 -f my_app   # ログローテ等

fuser: ファイル使用中のプロセスを kill

# /tmp を使っているプロセス
fuser -v /tmp/

# /var/log/app.log を開いているプロセス
fuser /var/log/app.log
# /var/log/app.log: 1234 5678

# kill しながら一覧表示
fuser -k /var/log/app.log

# umount できないときの常套手段
fuser -mv /mnt/foo
fuser -km /mnt/foo
umount /mnt/foo

# ポート使用中のプロセス
fuser -n tcp 8080
# 8080/tcp: 1234

# 同じことを lsof でも
lsof -i:8080
ss -lntp | grep 8080

systemd で管理されているサービス

Apache / Nginx / MySQL など、systemd で起動されたサービスは systemctl で停止するのが正しい流儀。直接 kill すると自動再起動が走ったり、状態管理が壊れます:

# 正しい停止
sudo systemctl stop nginx
sudo systemctl status nginx

# 再起動 (設定再読込)
sudo systemctl restart nginx

# 設定のみ再読込 (止めない)
sudo systemctl reload nginx

# 異常終了したサービスを再開
sudo systemctl reset-failed nginx
sudo systemctl start nginx

# 関連プロセスを強制終了 (最終手段)
sudo systemctl kill -s SIGKILL nginx

SIGHUP の典型用途: 設定再読込

# 多くのデーモンは SIGHUP を「設定再読込」として実装
sudo kill -HUP $(pgrep -x nginx)
sudo kill -HUP $(cat /var/run/sshd.pid)

# = systemctl reload と同じ役割
sudo systemctl reload nginx
sudo systemctl reload sshd

# 注意: アプリにより SIGHUP の意味は異なる
# - nginx, Apache, sshd : 設定再読込
# - bash, less          : 終了
# - syslog             : ログファイル再オープン

ゾンビプロセスは kill 不可

ゾンビプロセス (defunct) は既に終了済で残骸として残っている状態。親プロセスが wait() 呼び出ししていないせい。kill しても消えません:

# ゾンビ検索
ps aux | grep -w Z
ps aux | awk '$8=="Z" {print $2, $11}'

# 親 PID を確認
ps -o pid,ppid,state,cmd -p ZOMBIE_PID

# 親プロセスに SIGCHLD を送って収穫を促す
kill -CHLD PARENT_PID

# それでもダメなら親プロセスを kill (子は init/systemd に引き取られて消える)
kill PARENT_PID

Windows での同等操作

# プロセス一覧
Get-Process
tasklist

# 名前で
Get-Process notepad
tasklist | findstr notepad

# PID で kill
Stop-Process -Id 1234
taskkill /PID 1234

# 強制
Stop-Process -Id 1234 -Force
taskkill /F /PID 1234

# 名前で
Stop-Process -Name notepad -Force
taskkill /F /IM notepad.exe

# ツリー (子プロセスも)
taskkill /F /T /PID 1234

# CPU 高負荷プロセスを見る
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5

FAQ

Q: SIGKILL で殺せないプロセスがある
A: D 状態 (uninterruptible sleep) のプロセスは I/O 完了待ち中で SIGKILL も効かない。NFS タイムアウトやハングしたディスク待ちが典型。原因の I/O を解消するか、最悪は OS 再起動。

Q: 自分が起動していないプロセスを kill したい
A: root 権限が必要。sudo kill 1234。他ユーザの kill は root のみ可能。

Q: スクリプトで「動いていれば kill、いなければ何もしない」
A: pkill -f "my_script.py" || truepgrep -f xxx && pkill -f xxx でも良い。

Q: kill した後 PID が再利用される?
A: はい。OS は PID を循環的に再割当てするので、長時間使われていない古い PID を kill すると別のプロセスを殺してしまう可能性あり。スクリプトでは pgrep でその場で取得して即 kill するのが安全。