killコマンドでプロセスを終了する方法|シグナルの違いやkillallもコマンド


図解60p「Linuxサーバー構築入門マニュアル」無料
登録10秒/自動返信でDL/合わなければ解除3秒
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxコマンド, LinuxコマンドK-O, プロセス管理コマンド > killコマンドでプロセスを終了する方法|シグナルの違いやkillallもコマンド
「暴走したプロセスを止めたいのに、killコマンドを打っても終了しない」
「kill -9 で強制終了していいのか、毎回不安になる」
サーバー運用の現場では、応答しなくなったプロセスを安全に停止させる必要がある場面に必ず遭遇します。

この記事では、プロセスにシグナルを送る kill(キル)コマンド の実践的な使い方を解説します。
SIGTERM と SIGKILL の違いから、プロセス名で終了できる killall / pkill、ゾンビプロセスへの対処法まで、現場で安全にプロセスを管理するためのノウハウをまとめました。

killコマンドとは?(プロセスにシグナルを送るコマンド)

kill は、その名前から「プロセスを殺すコマンド」と思われがちですが、正確には プロセスに「シグナル」と呼ばれる通知を送るコマンド です。

シグナルとは、Linuxカーネルがプロセスに対して「終了してください」「設定を再読み込みしてください」などの指示を伝える仕組みです。終了以外にもさまざまなシグナルがあり、用途に応じて使い分けます。

終了したいプロセスのPIDを調べる

kill コマンドを実行するには、対象プロセスの PID(プロセスID)が必要です。まずはPIDの調べ方を確認しましょう。

1. ps aux | grep で探す

最も基本的な方法です。ps aux で全プロセスを一覧表示し、grep で絞り込みます。

# httpd のプロセスを探す(grep 自身を除外する) $ ps aux | grep httpd | grep -v grep root 1234 0.0 0.5 230000 5000 ? Ss 10:00 0:00 /usr/sbin/httpd -DFOREGROUND apache 1235 0.0 0.3 230000 3000 ? S 10:00 0:00 /usr/sbin/httpd -DFOREGROUND

左から2番目の数字がPIDです。この例では親プロセスのPIDが 1234 です。
grep -v grep を付けないと、grep自身のプロセスもヒットしてしまうため、パイプ3段(ps aux | grep xxx | grep -v grep)が定番の書き方です。

2. pgrep でPIDだけを取得する

pgrep を使えば、プロセス名からPIDだけをシンプルに取得できます。

# httpd のPIDだけを表示する $ pgrep httpd 1234 1235 # プロセス名も一緒に表示する $ pgrep -a httpd 1234 /usr/sbin/httpd -DFOREGROUND 1235 /usr/sbin/httpd -DFOREGROUND

基本的な使い方(シグナルの種類と違い)

PIDが分かったら、kill コマンドでシグナルを送ります。シグナルの使い分けが非常に重要なので、しっかり理解してください。

1. まずは kill(SIGTERM)で「お願い」する

シグナルを指定せずに kill を実行すると、デフォルトで SIGTERM(シグナル番号15)が送られます。これは「正常に終了してください」というお願いです。

# PID 1234 のプロセスに終了をお願いする(SIGTERM) $ kill 1234 # 明示的にシグナル番号を指定する書き方(上と同じ意味) $ kill -15 1234

SIGTERM を受け取ったプロセスは、一時ファイルの削除やデータの保存など「後始末」をしてから終了します。まずは必ず SIGTERM を試してください。

2. kill -9(SIGKILL)で「強制終了」する

SIGTERM を送っても終了しないプロセスには、SIGKILL(シグナル番号9)を使います。これはカーネルが直接プロセスを停止させるため、プロセス側で無視することができません

# PID 1234 のプロセスを強制終了する $ kill -9 1234 # シグナル名で指定する書き方 $ kill -SIGKILL 1234

ただし、SIGKILL は後始末の処理が実行されないため、一時ファイルの残存やデータの不整合が発生する可能性があります。いきなり kill -9 を使うのではなく、SIGTERM → 数秒待つ → SIGKILL の順番を必ず守ってください。

3. kill -1(SIGHUP)で「設定を再読み込み」させる

SIGHUP(シグナル番号1)は、多くのデーモン(サーバープロセス)で「設定ファイルの再読み込み」として解釈されます。プロセスを停止せずに設定変更を反映したい時に使います。

# Apache に設定ファイルを再読み込みさせる # kill -1 1234 # または # kill -HUP 1234

※すべてのプロセスがSIGHUPで設定再読み込みに対応しているわけではありません。対象のソフトウェアのドキュメントを確認してください。
なお、systemd環境では systemctl reload httpd のようにサービス単位で再読み込みする方が確実です。kill でシグナルを送るのは、systemctl が使えない場面やデーモン以外のプロセスが対象の場合に使ってください。

以下が、覚えておくべき主要シグナルの一覧です。

SIGTERM(15):正常終了を要求する。プロセスが後始末をしてから終了する(デフォルト)
SIGKILL(9):強制終了。プロセスは無視できない。後始末は行われない
SIGHUP(1):設定ファイルの再読み込み(対応しているデーモンのみ)
SIGINT(2):割り込みによる終了。キーボードの Ctrl + C と同じ動作
SIGSTOP(19):プロセスを一時停止する。SIGCONT(18)で再開できる

プロセス名で終了する(killall / pkill)

PIDをいちいち調べるのが面倒な場合、プロセス名を直接指定して終了させるコマンドがあります。

1. killall でプロセス名を指定する

killall は、指定した名前に完全一致するすべてのプロセスにシグナルを送ります。

# httpd という名前のプロセスをすべて終了する $ killall httpd # 強制終了する場合 $ killall -9 httpd

2. pkill で柔軟に検索して終了する

pkill は部分一致で検索できるため、killall よりも柔軟にプロセスを指定できます。

# プロセス名に "http" を含むプロセスをすべて終了する $ pkill http # 特定のユーザーが実行しているプロセスだけを終了する $ pkill -u apache httpd

【重要】killall / pkill の危険性

killallpkill条件に一致するすべてのプロセスにシグナルを送る ため、意図しないプロセスまで終了させてしまうリスクがあります。

特に本番サーバーでは、まず pgrep で対象のプロセスを確認してから実行するのが鉄則です。

# まず対象を確認する(終了はしない) $ pgrep -a httpd 1234 /usr/sbin/httpd -DFOREGROUND 1235 /usr/sbin/httpd -DFOREGROUND # 確認できたら終了する $ pkill httpd

実務で使えるkillのTips

ゾンビプロセスが残った時の対処法

ps aux の STAT 列に Z と表示されるプロセスは「ゾンビプロセス」です。これはすでに実行が終了しているが、親プロセスが終了状態を回収していないプロセスです。

ゾンビプロセス自体にはCPUやメモリを消費しないため実害は少ないですが、大量に溜まるとプロセステーブルを圧迫します。

ゾンビプロセスに kill を送っても効果はありません。対処法は 親プロセスにSIGCHLDを送る か、親プロセスを終了させる ことです。

# ゾンビプロセスを確認する $ ps aux | grep -w Z user 5678 0.0 0.0 0 0 ? Z 10:00 0:00 [defunct] # 親プロセスのPIDを調べる(PPIDが親のPID) $ ps -o pid,ppid,stat,cmd -p 5678 PID PPID STAT CMD 5678 4321 Z [defunct] # 親プロセスにSIGCHLDを送る $ kill -SIGCHLD 4321

kill -0 でプロセスの生存確認をする

シグナル番号 0 は特殊なシグナルで、実際にはシグナルを送らず、プロセスが存在するかどうかだけを確認できます。シェルスクリプトでプロセスの生存チェックに使えます。

# PID 1234 のプロセスが存在するか確認する $ kill -0 1234 && echo "プロセスは実行中" || echo "プロセスは存在しない"

「kill しても終了しない」時の対処法

kill(SIGTERM)を送ってもプロセスが終了しない場合、いくつかの原因が考えられます。

1. プロセスがSIGTERMをハンドリングしている

一部のプロセスは、SIGTERM を受け取った時に独自の処理を行い、すぐには終了しないことがあります。数秒~数十秒待ってもまだ終了しない場合は、kill -9(SIGKILL)を使ってください。

# SIGTERM を送る $ kill 1234 # 5秒待ってもプロセスが残っている場合 $ sleep 5 && kill -0 1234 && kill -9 1234

2. D状態(ディスクI/O待ち)のプロセス

ps aux の STAT 列が D(割り込み不可のスリープ状態)になっているプロセスは、ディスクI/Oの完了を待っている状態です。

D状態のプロセスは SIGKILL でも終了できません。これはカーネルレベルでI/O完了を待っているためで、kill では対処できません。
NFSマウントのハングやディスク障害が原因のことが多いため、マウントポイントの状態やストレージを確認してください。

3. 権限が足りない(Permission denied)

一般ユーザーで他のユーザーが起動したプロセスを kill しようとすると「Operation not permitted」エラーになります。root ユーザーか sudo を使って実行してください。

# 一般ユーザーで実行するとエラーになる場合 $ kill 1234 -bash: kill: (1234) - Operation not permitted # sudo を付けて実行する $ sudo kill 1234

本記事のまとめ(kill関連コマンド早見表)

やりたいこと コマンド
プロセスを正常終了させる(SIGTERM) kill PID
プロセスを強制終了させる(SIGKILL) kill -9 PID
設定ファイルを再読み込みさせる(SIGHUP) kill -1 PID
プロセスの生存を確認する kill -0 PID
プロセス名でPIDを調べる pgrep -a プロセス名
プロセス名を指定して終了する(完全一致) killall プロセス名
プロセス名を指定して終了する(部分一致) pkill プロセス名
使用できるシグナル一覧を表示する kill -l

プロセス管理の基本をもっと体系的に学びたいですか?

killコマンドはプロセス管理の基本ですが、実務のサーバー運用では、プロセスの監視・トラブルシュート・安全な停止手順を体系的に身につけることが重要です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。



無料プレゼント
図解60p「Linuxサーバー構築入門マニュアル」
独学で詰まる前に、“型(手順書)”で最初の環境構築をサクッと終わらせましょう。
登録10秒/自動返信でDL/合わなければ解除3秒
無料で受け取る ※メールアドレスだけでもOK(必須項目は最小限)

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

<<関連記事>>
・pstree
・chsh
・finger
・duコマンドでディスク使用量を確認する方法|ディレクトリごとの容量や容量順ソートも
・LinuxのOSバージョンを確認するコマンド|uname・os-release・hostnamectlの使い方

図解60pのLinux無料マニュアル
登録10秒/自動返信でDL
無料で受け取る