メインコンテンツへスキップ
中級9分で読める

killコマンドでプロセス制御

Linuxのkillコマンドを使ってプロセスを制御する方法を解説。シグナルの種類、安全な終了方法、強制終了、実践的な使い方まで詳しく紹介します。

システム編killプロセスシグナルシステム管理

🎯 この記事で学べること

  • 1
    `kill`コマンドの基本的な使い方をマスターできます
  • 2
    シグナルの種類(TERM、KILL、HUPなど)と使い分けがわかります
  • 3
    プロセスを安全に終了させる段階的なアプローチを身につけられます
  • 4
    pkillやkillallなどの関連コマンドの使い方を学べます
  • 5
    トラブルシューティングとベストプラクティスを理解できます

読了時間: 約9

killコマンドって怖くない!

こんにちは!今回はkillコマンドについて学んでいきましょう。

「kill」という名前を聞くと、ちょっと物騒に感じるかもしれませんね。でも心配しないでください!killコマンドは、実はプロセスに「お願い」を送るコマンドなんです。「終了してください」とか「設定を読み直してください」とか、いろいろなメッセージ(シグナル)を送ることができるんですよ。

基本的な使い方

まずはシンプルに

killコマンドの基本形は「kill プロセスID」です:

# プロセスID 1234 に終了をお願いする
$ kill 1234

# 複数のプロセスに同時にお願いする
$ kill 1234 5678 9012

何もオプションを付けないと、killコマンドは「TERM(終了してください)」というシグナルを送ります。これは「お行儀よく終了してね」というお願いです。

プロセスIDの調べ方

プロセスをkillするには、まずプロセスID(PID)を知る必要があります:

# psコマンドで探す
$ ps aux | grep firefox
user  1234  0.5  2.1  firefox

# pidofコマンドで直接取得
$ pidof firefox
1234

# pgrepコマンドでパターン検索
$ pgrep -l fire
1234 firefox

ps aux | grep プロセス名は最もよく使われる方法です。表示されたPIDを使ってkillできます!

シグナルの種類を理解しよう

主要なシグナル一覧

プロセスに送れるシグナルにはいろいろな種類があります:

| シグナル番号 | シグナル名 | 意味 | 使いどころ | |------------|-----------|------|-----------| | 1 | HUP | ハングアップ | 設定ファイルの再読み込み | | 2 | INT | 割り込み | Ctrl+Cと同じ効果 | | 9 | KILL | 強制終了 | どうしても終了しない時の最終手段 | | 15 | TERM | 終了要求 | 通常の終了(デフォルト) | | 18 | CONT | 再開 | 停止したプロセスを再開 | | 19 | STOP | 停止 | プロセスを一時停止 |

シグナルの指定方法

シグナルは番号でも名前でも指定できます:

# 番号で指定
$ kill -9 1234

# 名前で指定(こちらがおすすめ!)
$ kill -TERM 1234
$ kill -HUP 5678
$ kill -KILL 9012

# 使えるシグナル一覧を見る
$ kill -l

kill -9(SIGKILL)は強制終了です。プロセスは何も保存せずに即座に終了するので、データが失われる可能性があります。最後の手段として使いましょう!

🎮 理解度チェック

Q1: kill 1234を実行した時、どのシグナルが送られますか?

kill 1234を実行した時、どのシグナルが送られますか?

安全にプロセスを終了する方法

段階的アプローチ(これが大事!)

プロセスを終了する時は、いきなり強制終了するのではなく、段階的に行いましょう:

# ステップ1: まず普通にお願いする(TERM)
$ kill -TERM 1234

# ステップ2: 5秒ほど待つ
$ sleep 5

# ステップ3: まだ生きているか確認
$ ps -p 1234
# プロセスが表示されたら、まだ動いている

# ステップ4: それでもダメなら強制終了
$ kill -KILL 1234

実際のスクリプトにするとこんな感じです:

#!/bin/bash
# 安全なkillスクリプト

PID=$1

echo "プロセス $PID に終了をお願いしています..."
kill -TERM $PID

# 5秒待つ
for i in {1..5}; do
    if ! ps -p $PID > /dev/null; then
        echo "プロセスは正常に終了しました"
        exit 0
    fi
    sleep 1
done

echo "プロセスが応答しません。強制終了します..."
kill -KILL $PID

設定の再読み込み(HUPシグナル)

多くのサーバープログラムは、HUPシグナルで設定を再読み込みします:

# nginxの設定を再読み込み
$ sudo kill -HUP $(pidof nginx)

# または
$ sudo nginx -s reload  # 専用コマンドがある場合

HUPシグナルは「Hang UP(電話を切る)」の略ですが、現在は「設定を読み直して」という意味で使われることが多いです。

便利な関連コマンド

pkillコマンド(名前でkill)

プロセス名で直接killできる便利なコマンドです:

# firefoxという名前のプロセスをすべて終了
$ pkill firefox

# パターンマッチで終了
$ pkill -f "python script.py"

# 特定ユーザーのプロセスだけ
$ pkill -u username chrome

killallコマンド(全部kill)

指定した名前のプロセスをすべて終了します:

# chromeプロセスをすべて終了
$ killall chrome

# 確認しながら終了(-i オプション)
$ killall -i firefox
Kill firefox(1234) ? (y/N) 

# 終了を待つ(-w オプション)
$ killall -w python

pkillの方がkillallより新しく、より柔軟です。基本的にはpkillを使うことをおすすめします!

🎮 理解度チェック

Q2: プロセスを安全に終了させる時、最初に送るべきシグナルは?

プロセスを安全に終了させる時、最初に送るべきシグナルは?

実践的な使い方

ゾンビプロセスの対処

ゾンビプロセス(終了したけど親が回収していない)を見つけたら:

# ゾンビプロセスを探す
$ ps aux | grep defunct
user  1234  0.0  0.0  0  0  ?  Z  10:00  0:00 [zombie] <defunct>

# 親プロセスを確認
$ ps -o ppid= -p 1234
5678

# 親プロセスにシグナルを送る
$ kill -CHLD 5678

CPU使用率の高いプロセスを終了

# CPU使用率TOP10を確認
$ ps aux --sort=-%cpu | head -10

# 問題のプロセスを特定したら
$ kill -TERM 問題のPID

# スクリプトで自動化
#!/bin/bash
# CPU使用率が80%を超えるプロセスを警告

ps aux | awk '$3 > 80.0 {
    print "警告: " $2 " (" $11 ") がCPUを " $3 "% 使用中"
}'

バックグラウンドジョブの制御

# 長時間かかるコマンドをバックグラウンドで実行
$ long_command &
[1] 1234

# ジョブ一覧を確認
$ jobs
[1]+  Running   long_command &

# ジョブ番号でkill(%を付ける)
$ kill %1

# 最後のジョブをkill
$ kill %%

トラブルシューティング

よくある問題と解決法

「Permission denied」エラー

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

# 解決法: 他人のプロセスにはsudoが必要
$ sudo kill 1234

プロセスが終了しない

# プロセスの状態を確認
$ ps aux | grep 1234
user  1234  0.0  0.0  D  ...  # Dは「割り込み不可能なスリープ」

# この場合、プロセスはI/O待ちなどで、KILLシグナルも効かない
# システムの再起動が必要な場合もある

誤って重要なプロセスを終了してしまった

# サービスとして登録されている場合
$ sudo systemctl restart サービス名

# 手動で再起動
$ /usr/bin/プログラム名 &

# ログを確認
$ sudo journalctl -xe

🎮 理解度チェック

Q3: pkill -f "python script.py"は何をするコマンドですか?

pkill -f 'python script.py'は何をするコマンドですか?

ベストプラクティス

killする前の確認リスト

  1. 正しいプロセスか確認

    $ ps -fp 1234
    
  2. 何をしているか確認

    $ lsof -p 1234  # 開いているファイルを確認
    
  3. 段階的にシグナルを送る

    • TERM → 待つ → KILL
  4. ログを残す

    $ logger "Killing process 1234 (firefox)"
    $ kill 1234
    

安全のためのエイリアス

# ~/.bashrcに追加
alias kill='kill -TERM'  # デフォルトを明示的に
alias killall='killall -i'  # 確認付きに

# 危険なコマンドには確認を
careful_kill() {
    echo "本当に $1 を終了しますか? (y/N)"
    read answer
    if [[ $answer == "y" ]]; then
        kill "$@"
    fi
}

📝 まとめ

今回はkillコマンドについて学びました!

  • killはプロセスにシグナルを送るコマンド(単なる「殺す」コマンドではない)
  • デフォルトはTERMシグナル(丁寧な終了要求)
  • 段階的アプローチ:TERM → 待つ → KILL が基本
  • pkillkillallで名前指定もできる
  • 実行前の確認と、適切なシグナルの選択が大切

killコマンドは強力なツールですが、正しく使えば安全にプロセスを管理できます。まずはTERMシグナルから始めて、必要な時だけKILLを使うようにしましょう!

次はtopコマンドでリアルタイムのプロセス監視方法を学びます。どのプロセスがリソースを使っているか、視覚的に確認できるようになりますよ!

YouTube動画で復習

動画でさらに詳しく学びたい方は、CommandAcademyのYouTubeチャンネルをチェック!視覚的にコマンドの動作を確認できます。

killコマンドは名前は怖いけど、実際は「プロセスとお話しする」コマンドです。適切に使えば、システム管理の強い味方になってくれますよ!