【Linux】psとkillでプロセスを確認・終了する方法|kill -9との違い・pgrep/pkill

【Linux】psとkillでプロセスを確認・終了する方法|kill -9との違い・pgrep/pkill Linux

「動きっぱなしのプログラムを止めたい」「どんなプロセスが動いているか確認したい」——Linuxでは、実行中のプログラム(プロセス)をpsで確認し、killで終了させます。固まったプロセスの強制終了や、暴走したスクリプトの停止など、サーバー運用でも日常的に使う基本操作です。

つまずきやすいのは、killkill -9の違いです。通常のkillは「終了してください」というお願い(TERMシグナル)で、プロセスが後片付けをして終われます。一方kill -9は問答無用の強制終了で、後片付けの猶予がありません。この記事では、実機のLinux(WSLのDebian)で実際にプロセスを起動・終了させながら、pskillを整理します。

先に結論

  • プロセスの一覧はps auxps aux | grep 名前で絞り込みます。
  • 終了はkill PID(PIDはpsで確認した番号)。
  • まず通常のkillを試し、効かないときだけkill -9を使います。
  • kill -9は強制終了で、プロセスに後片付けの猶予を与えません。
  • 名前から探す・終了するにはpgreppkillが便利です。
  • pkill -fはコマンドライン全体に一致するため、意図しないプロセスを巻き込むことがあります。

psの出力の絞り込みはgrepコマンド、列の抽出はawkコマンド、パイプの仕組みはリダイレクトとパイプもあわせて参考になります。

スポンサーリンク

プロセスを確認する(ps aux)

実行中のプロセス一覧はps auxで表示します。a=全ユーザー、u=詳細表示、x=端末を持たないものも含む、という意味で、この3点セットが定番です。

ps aux の読み方
ps aux
# USER  PID %CPU %MEM ... COMMAND
# root    1  0.0  0.1 ... /sbin/init
# user  123  2.5  1.0 ... node server.js

# 主な列:
#  USER    … 実行しているユーザー
#  PID     … プロセスID(kill で使う番号)
#  %CPU    … CPU使用率
#  %MEM    … メモリ使用率
#  COMMAND … 実行中のコマンド

# 特定のプロセスを探す(grep と組み合わせ)
ps aux | grep nginx

実機でも、ps auxのヘッダにUSER PID %CPU %MEM ... COMMANDが並び、起動したプロセスが一覧に現れることを確認しました。もっとも重要なのがPID(プロセスID)で、終了させるときに使う番号です。プロセスが多いときはps aux | grep 名前で絞り込みます。なお、grep自身も一覧に出てしまうため、grep [n]ginxのように書くかpgrep(後述)を使うと除外できます。

CPU・メモリ順に並べる

「何が重いのか」を調べたいときは、--sortで並べ替えます。-%memでメモリ使用率の高い順、-%cpuでCPU使用率の高い順です。

重いプロセスを探す
# メモリ使用率が高い順(上位5件)
ps aux --sort=-%mem | head -6

# CPU使用率が高い順
ps aux --sort=-%cpu | head -6

# リアルタイムに監視したいときは top コマンド
top

実機でも、ps aux --sort=-%memでメモリ使用率の高い順に並び、先頭に最も重いプロセスが表示されました。headと組み合わせれば上位だけを確認できます。「サーバーが重い」というときに、まずこれで犯人の見当をつけるのが定番です。刻々と変わる状況を見たいときはtopqで終了)を使います。

プロセスを終了する(kill)

プロセスを終了させるには、psで確認したPIDをkillに渡します。通常のkillは「TERM(終了要請)」というシグナルを送り、プロセスは後片付けをしてから終了できます。

kill で終了する
# PID を調べて終了させる
ps aux | grep myapp     # PID を確認(例: 1234)
kill 1234               # 終了要請(TERM)を送る

# 終了したか確認
ps aux | grep myapp

実機でも、バックグラウンドで動かしたプロセス(sleep)にkill PIDを送ると、正常に終了してpsの一覧から消えました。killという名前ですが、実際は「シグナル(合図)を送る」コマンドで、既定のTERMシグナルは『終了してください』という要請です。行儀のよいプログラムはこれを受けて、ファイルを閉じる・一時データを消すなどの後片付けをしてから終了します。

【重要】kill -9 との違い

通常のkillで終了しないプロセスもあります。そのときの最終手段がkill -9(KILLシグナル)です。プロセスに拒否権はなく、OSが即座に強制終了させます。ただしいきなり-9を使うべきではありません

kill と kill -9
# STEP1: まず通常の kill(後片付けの猶予を与える)
kill 1234

# STEP2: それでも終了しないときだけ -9(強制終了)
kill -9 1234

# -9 は SIGKILL。プロセスは受け取りを拒否も無視もできない
通常killが効かないプロセスも-9なら止まる(実証)

実機で、TERMシグナルを無視するように設定したプロセスtrap "" TERM)を用意して確認しました。このプロセスに通常のkillを送っても生き残ったままでしたが、kill -9を送ると即座に強制終了しました。-9(KILL)はプロセス側で無視できない、OSレベルの強制終了だからです。ただし、-9は後片付けの猶予を一切与えません。書き込み途中のファイルが壊れたり、一時ファイルやロックが残ったりする恐れがあります。「まずkillで数秒待つ → ダメならkill -9」の順番を守るのが安全な作法です。データベースなど重要なプロセスへの-9はとくに慎重に。

名前で探す・終了する(pgrep / pkill)

PIDをいちいち調べるのが面倒なときは、プロセス名で直接探せるpgrep、名前で終了できるpkillが便利です。

pgrep と pkill
# 名前が完全一致するプロセスの PID を表示
pgrep -x sleep        # 例: 1234

# 名前で終了(完全一致)
pkill -x sleep

# -f: コマンドライン全体で一致(引数も含めて探せる)
pgrep -f "node server.js"
pkill -f "node server.js" 
-fは便利だが巻き込みに注意

実機で確認したところ、pgrep -x sleepは起動したプロセスのPIDを正しく返し、pkill -x sleepで該当プロセスがすべて終了しました。-xプロセス名の完全一致で、安全に対象を絞れます。一方-f引数を含むコマンドライン全体に一致するため、node server.jsのように「同名コマンドの特定の1つ」を狙えて便利ですが、検索文字列が別のプロセスのコマンドラインにも含まれていると、意図しないプロセスまで終了させてしまいますpkill -fを使う前に、同じパターンでpgrep -fを実行して、対象のPID一覧を確認してから実行するのが安全です。

主なコマンドまとめ

プロセス管理でよく使うものをまとめます。

コマンド 働き
ps aux 全プロセスの一覧
ps aux | grep 名前 名前で絞り込み
ps aux --sort=-%mem メモリ使用率の高い順
kill PID 終了要請(TERM)
kill -9 PID 強制終了(最終手段)
pgrep -x 名前 / -f パターン 名前/コマンドラインでPIDを探す
pkill -x 名前 名前で終了
top リアルタイム監視(qで終了)

よくある失敗

いきなりkill -9を使う

後片付けの猶予が無く、ファイル破損やロック残りの原因になります。まず通常のkillを試します。

grepで自分自身が引っかかる

ps aux | grep nginxにはgrep自身も出ます。grep [n]ginxpgrepを使います。

pkill -fで無関係なプロセスを巻き込む

-fはコマンドライン全体に一致します。先にpgrep -fで対象を確認します。

PIDを間違えて別のプロセスを消す

PIDは使い回されます。killの直前にpsで確認します。

他ユーザーのプロセスを終了しようとする

権限がないとOperation not permittedになります。必要なら管理者権限で行います。

よくある質問

Q実行中のプロセスを確認するには?
Aps auxで全プロセスの一覧が表示されます。USER(実行ユーザー)・PID(プロセスID)・%CPU%MEMCOMMANDなどの列があり、特定のプロセスを探すときはps aux | grep 名前で絞り込みます。リアルタイム監視ならtopです。
Qkillとkill -9の違いは何ですか?
A通常のkillはTERM(終了要請)で、プロセスは後片付けをしてから終了できます。kill -9はKILL(強制終了)で、プロセスは拒否も無視もできず即座に止められますが、後片付けの猶予がありません。実機でも、TERMを無視するプロセスが-9でだけ終了することを確認しています。まずkill、効かなければ-9の順で使います。
Qプロセス名だけで終了させるには?
Apkill -x プロセス名で、名前が完全一致するプロセスを終了できます。引数まで含めて指定したいときはpkill -f "パターン"を使いますが、コマンドライン全体に一致するため意図しないプロセスを巻き込む恐れがあります。先にpgrep -fで対象を確認してから実行してください。
Qメモリを食っているプロセスを探すには?
Aps aux --sort=-%mem | headで、メモリ使用率の高い順に表示されます。CPUなら--sort=-%cpuです。「サーバーが重い」ときに、まずこれで原因の見当をつけるのが定番です。
Qkill -9はなぜ最終手段なのですか?
Aプロセスに後片付け(ファイルのクローズ・一時データの削除・接続の切断など)をする猶予を与えないためです。書き込み途中のデータが壊れたり、ロックファイルが残って次の起動に支障が出たりすることがあります。通常のkillで数秒待ち、それでも終了しない場合にだけ使ってください。

まとめ

  • プロセス一覧はps aux、絞り込みは| grep、重い順は--sort=-%mem
  • 終了はkill PIDまず通常のkill、効かないときだけkill -9
  • kill -9は後片付けの猶予が無い強制終了。使いどころは慎重に。
  • 名前で扱うならpgrep -xpkill -x-fは巻き込みに注意
  • 実行前にpgrepで対象PIDを確認する習慣が安全です。

プロセスの確認と終了は、Linux運用の基本動作です。「ps auxで見て、killで止めて、ダメなら-9」という流れと、その理由(後片付けの猶予)を理解しておけば、固まったプログラムにも落ち着いて対処できます。pgreppkillも覚えて、効率よくプロセスを管理しましょう。