はじめに

こんにちは!今回はkillコマンドについて解説します。

killはプロセスを終了するコマンドですね。

暴走プログラムの強制停止、不要なプロセスの削除、サービスの再起動など、サーバー運用では欠かせません。ただし強制終了は危険なので、段階的な終了方法を理解することが大切です。


killコマンドとは

killは、指定したプロセスを終了するコマンドです。

実際には「プロセスを終了する」というより「プロセスにシグナルを送る」ことで、どのように終了するかを制御できます。段階的な終了(TERM→KILL)で、データ保存やクリーンアップの機会を与えられます。

主な用途:

  • 暴走プロセスの停止
  • サービスの再起動
  • バックグラウンドプロセスの管理

基本構文

1
kill [シグナル] PID

シグナルを省略するとTERM(終了)が送られます。


主なシグナル

シグナル 説明
-15 (TERM) 終了要求(クリーンシャットダウン可能、デフォルト)
-9 (KILL) 強制終了(無条件に終了)
-1 (HUP) ハングアップ(設定ファイル再読込)
-2 (INT) 割り込み(Ctrl+Cと同じ)
-3 (QUIT) 終了(コアダンプ作成)
-19 (STOP) 一時停止
-18 (CONT) 再開

使用例

例1: 基本的なプロセス終了(推奨)

1
kill 3456

実行結果:

1
(成功時は何も表示されない)

プロセスID 3456にTERM シグナルを送ります。プロセスが正常に終了を準備できます。


例2: プロセスを検索して終了

1
kill $(ps aux | grep apache | grep -v grep | awk '{print $2}')

実行結果:

1
(apacheプロセスが終了)

grepで検索したプロセスを自動取得して終了します。複数プロセス終了に便利です。


例3: 強制終了(KILLシグナル)

1
kill -9 3456

実行結果:

1
(成功時は何も表示されない)

プロセスを強制終了します。プロセスが応答しない場合の最終手段です。


例4: ハングアップシグナル(設定再読込)

1
kill -1 1234

実行結果:

1
(成功時は何も表示されない)

-1 (HUP)シグナルで設定ファイルの再読込を指示します。サービス再起動より軽いです。


例5: 複数プロセスを一括終了

1
killall apache2

実行結果:

1
(すべてのapache2プロセスが終了)

killallコマンドでプロセス名指定で一括終了できます。


例6: プロセスを一時停止

1
kill -19 3456

実行結果:

1
(プロセスが一時停止される)

-19 (STOP)シグナルで処理を一時停止します。再開は-18 (CONT)で可能です。


例7: 一時停止したプロセスを再開

1
kill -18 3456

実行結果:

1
(プロセスが再開)

-18 (CONT)シグナルで一時停止していたプロセスを再開します。


例8: ユーザーのすべてのプロセスを終了

1
killall -u apache

実行結果:

1
(apacheユーザーのすべてのプロセスが終了)

特定ユーザーが実行中のすべてのプロセスを終了します。


例9: シグナルを強化して終了(段階的)

1
2
3
4
5
6
# 段階1:通常終了を試みる
kill 3456
sleep 2

# 段階2:応答なければ強制終了
kill -9 3456

実行結果:

1
(プロセスが終了)

まずTERMで終了を要求し、応答なければKILLで強制終了します。推奨手法です。


例10: Webサーバーのグレースフルリスタート

1
kill -1 $(cat /var/run/apache2.pid)

実行結果:

1
(Apacheが設定を再読込してリスタート)

.pidファイルからプロセスIDを取得して再起動します。サービス管理で一般的です。


Tips・注意点

TERMとKILLの使い分け

1
2
3
4
5
# ✓ 推奨:まずはTERM
kill 3456

# ✗ 避けるべき:最初からKILL
kill -9 3456

最初からKILLを使うと、プロセスがデータを保存できず、ファイルが破損することがあります。


killコマンドのエラーメッセージ

1
2
3
4
5
6
7
8
$ kill 99999
bash: kill: (99999) - No such process

$ kill 3456
bash: kill: kill (3456) - Operation not permitted

# root権限で実行
sudo kill 3456

存在しないプロセスや権限がない場合はエラーが表示されます。


killallとpkill、pkillの違い

1
2
3
4
5
6
7
8
# killall:コマンド名で指定
killall apache2

# pkill:パターンで検索
pkill -f "python.*app.py"

# kill:PIDで指定(最も基本)
kill 3456

用途に応じて使い分けます。


実践的な使い方

暴走プロセスの停止

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# まずは状態を確認
ps aux | grep myapp

# TERMで終了を要求
kill 3456

# 2秒待機して応答確認
sleep 2
ps aux | grep myapp

# 応答なければ強制終了
kill -9 3456

標準的なトラブル対応手順です。


Webサーバーの設定再読込

1
2
3
4
5
# Nginxの再読込(HUPシグナル)
sudo kill -1 $(pgrep -f "nginx: master")

# Apacheのグレースフルリスタート
sudo systemctl reload apache2

サービス再起動をより軽い設定再読込で実現します。


バッチジョブの管理

1
2
3
4
5
6
7
8
9
# バッチジョブ実行
./long_job.sh &
JOB_PID=$!

# 時間がかかりすぎたら中断
sleep 300
if ps -p $JOB_PID > /dev/null; then
  kill $JOB_PID
fi

スクリプト内でプロセス管理できます。


ゾンビプロセスの親プロセスを終了

1
2
3
4
5
# ゾンビプロセスの確認
ps aux | grep Z

# 親プロセスID(PPID)を特定して終了
kill -9 2345

ゾンビプロセスは親プロセスを終了しることで解消されます。


まとめ

killコマンドのポイント:

  • 通常終了(推奨)kill PID(-15 TERM)
  • 強制終了kill -9 PID(最終手段)
  • 設定再読込kill -1 PID(-1 HUP)
  • 複数プロセスkillall processname
  • 段階的終了:まずTERM、次にKILL
  • root権限:他ユーザーのプロセスはsudoが必要
  • 推奨手法:TERM→KILL→確認の段階的手法

プロセス管理の重要なコマンドです。常に段階的終了を心がけることで、データ損失やシステム問題を防げますよ!