ひとことで言うと

# 通常の終了要求(SIGTERM)を送る
kill 1234

# 強制終了(SIGKILL)を送る
kill -9 1234

# プロセス名で終了させる
pkill node

やりたかったこと / 現象

「プロセスが固まって反応しない」「バックグラウンドで動かしたコマンドを止めたい」「ポートを掴んだままのプロセスを終了させたい」といった場面で、特定のプロセスを終了させたい。

kill はプロセスIDに対してシグナルを送るコマンドで、名前に反して必ずしも「強制終了」ではなく、まずはプロセスに「終了してほしい」という合図(シグナル)を送るのが基本的な使い方です。


環境

  • OS: Linux(Ubuntu / CentOS / Debian など)
  • 確認コマンド: kill -l, ps aux, pgrep

解決策

1. 終了したいプロセスのPIDを確認する

ps aux | grep node
user   1234  0.5  1.2  912345  45678 pts/0   Sl   10:00   0:03 node server.js

2列目の 1234 がプロセスID(PID)です。

2. SIGTERM(通常終了)を送る

kill 1234

シグナルを指定しない場合、デフォルトで SIGTERM (15) が送られます。プロセスに後片付け(ファイルのクローズ、接続の切断など)をする猶予を与えて終了を促すシグナルです。

3. SIGKILL(強制終了)を送る

SIGTERMを送ってもプロセスが終了しない場合は、強制的に終了させます。

kill -9 1234
# または
kill -SIGKILL 1234

SIGKILL はプロセス側で無視・後処理ができない、OSレベルで強制的に終了させるシグナルです。データの後片付けができないため、最終手段として使います。

4. プロセス名で終了させる(pkill / killall)

PIDを毎回調べるのが手間な場合は、名前を指定して終了できます。

# 名前が部分一致するプロセスを終了
pkill node

# 完全一致するプロセス名で終了
killall node
# 強制終了も同様にオプションを付けられる
pkill -9 node

5. 特定ユーザーのプロセスだけ終了する

pkill -u www-data

6. 使えるシグナル一覧を確認する

kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      9) SIGKILL
15) SIGTERM     ...

よくあるエラーと対処

kill: (1234): No such process

指定したPIDのプロセスがすでに終了しているか、PIDを間違えています。再度 ps auxpgrep で確認しましょう。

pgrep -a node

Operation not permitted

自分の所有ではないプロセス(rootや他ユーザーのプロセス)を終了しようとしています。権限を確認してください。

sudo kill -9 1234

kill -9 してもゾンビプロセスが残る

ゾンビプロセス(状態が Z のプロセス)は既に終了処理が完了しており、親プロセスが wait() していないだけの状態です。kill では消えません。親プロセスを再起動するか終了させる必要があります。

ps aux | grep 'Z'

ポートを掴んでいるプロセスを終了したい

# ポート3000を使っているプロセスのPIDを調べて終了
lsof -i:3000
kill -9 $(lsof -t -i:3000)

よくある質問

Q: kill -9 はいつでも使っていいですか? なるべく避けるべきです。SIGKILL はプロセスに後片付けの機会を与えないため、ファイル破損やデータ不整合の原因になることがあります。まず kill(SIGTERM)を試し、反応がなければ -9 を使いましょう。

Q: killpkill の違いは? kill はPID(プロセスID)を指定してシグナルを送ります。pkill はプロセス名やその他の条件で対象を検索し、まとめてシグナルを送れます。

Q: killallpkill はどちらを使うべき? killall はプロセス名の完全一致、pkill は正規表現によるパターンマッチにも対応しています。より柔軟な指定をしたい場合は pkill が便利です。

Q: SIGTERMとSIGKILL以外によく使うシグナルはありますか? SIGHUP (1) は設定再読み込みの合図としてよく使われ、SIGINT (2)Ctrl+C に相当します。

Q: Windowsで同じようなことをしたい場合は? taskkill /PID 1234 /Fkill -9 に近い動作をします。

Q: バックグラウンドジョブを止めたいだけなら kill を使う必要がありますか? シェルで実行中のジョブなら jobs でジョブ番号を確認し、kill %1 のように指定することもできます。


関連記事

おすすめのVPS/ドメイン/スクール

VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。