タイトル: kill プロセスを終了させる
SEOタイトル: Linux kill コマンド完全ガイド — シグナル/pkill/killall
| この記事の要点 |
|
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 ...
主なシグナル一覧
| 番号 | 名前 | 意味 | キャッチ可 |
|---|---|---|---|
| 1 | SIGHUP | ハングアップ。多くのデーモンは設定再読込として使う | ○ |
| 2 | SIGINT | 割り込み (Ctrl+C) | ○ |
| 3 | SIGQUIT | 中止 (Ctrl+\)、コアダンプ生成 | ○ |
| 9 | SIGKILL | 強制終了。プロセスは抵抗不可 | × (絶対) |
| 10 | SIGUSR1 | ユーザ定義 1。アプリ独自用途 (ログローテーション等) | ○ |
| 12 | SIGUSR2 | ユーザ定義 2 | ○ |
| 15 | SIGTERM | 終了要求。kill デフォルト。後始末させる | ○ |
| 17/19 | SIGSTOP | 一時停止 (Ctrl+Z 相当の SIGTSTP もある) | × |
| 18/19 | SIGCONT | 一時停止解除 | ○ |
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" || true。pgrep -f xxx && pkill -f xxx でも良い。
Q: kill した後 PID が再利用される?
A: はい。OS は PID を循環的に再割当てするので、長時間使われていない古い PID を kill すると別のプロセスを殺してしまう可能性あり。スクリプトでは pgrep でその場で取得して即 kill するのが安全。