「動きっぱなしのプログラムを止めたい」「どんなプロセスが動いているか確認したい」——Linuxでは、実行中のプログラム(プロセス)をpsで確認し、killで終了させます。固まったプロセスの強制終了や、暴走したスクリプトの停止など、サーバー運用でも日常的に使う基本操作です。
つまずきやすいのは、killとkill -9の違いです。通常のkillは「終了してください」というお願い(TERMシグナル)で、プロセスが後片付けをして終われます。一方kill -9は問答無用の強制終了で、後片付けの猶予がありません。この記事では、実機のLinux(WSLのDebian)で実際にプロセスを起動・終了させながら、psとkillを整理します。
- プロセスの一覧は
ps aux。ps aux | grep 名前で絞り込みます。 - 終了は
kill PID(PIDはpsで確認した番号)。 - まず通常の
killを試し、効かないときだけkill -9を使います。 kill -9は強制終了で、プロセスに後片付けの猶予を与えません。- 名前から探す・終了するには
pgrep・pkillが便利です。 pkill -fはコマンドライン全体に一致するため、意図しないプロセスを巻き込むことがあります。
psの出力の絞り込みはgrepコマンド、列の抽出はawkコマンド、パイプの仕組みはリダイレクトとパイプもあわせて参考になります。
プロセスを確認する(ps aux)
実行中のプロセス一覧はps auxで表示します。a=全ユーザー、u=詳細表示、x=端末を持たないものも含む、という意味で、この3点セットが定番です。
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と組み合わせれば上位だけを確認できます。「サーバーが重い」というときに、まずこれで犯人の見当をつけるのが定番です。刻々と変わる状況を見たいときはtop(qで終了)を使います。
プロセスを終了する(kill)
プロセスを終了させるには、psで確認したPIDをkillに渡します。通常のkillは「TERM(終了要請)」というシグナルを送り、プロセスは後片付けをしてから終了できます。
# 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を使うべきではありません。
# STEP1: まず通常の kill(後片付けの猶予を与える) kill 1234 # STEP2: それでも終了しないときだけ -9(強制終了) kill -9 1234 # -9 は SIGKILL。プロセスは受け取りを拒否も無視もできない
実機で、TERMシグナルを無視するように設定したプロセス(trap "" TERM)を用意して確認しました。このプロセスに通常のkillを送っても生き残ったままでしたが、kill -9を送ると即座に強制終了しました。-9(KILL)はプロセス側で無視できない、OSレベルの強制終了だからです。ただし、-9は後片付けの猶予を一切与えません。書き込み途中のファイルが壊れたり、一時ファイルやロックが残ったりする恐れがあります。「まずkillで数秒待つ → ダメならkill -9」の順番を守るのが安全な作法です。データベースなど重要なプロセスへの-9はとくに慎重に。
名前で探す・終了する(pgrep / pkill)
PIDをいちいち調べるのが面倒なときは、プロセス名で直接探せるpgrep、名前で終了できるpkillが便利です。
# 名前が完全一致するプロセスの PID を表示 pgrep -x sleep # 例: 1234 # 名前で終了(完全一致) pkill -x sleep # -f: コマンドライン全体で一致(引数も含めて探せる) pgrep -f "node server.js" pkill -f "node server.js"
実機で確認したところ、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]ginxかpgrepを使います。
pkill -fで無関係なプロセスを巻き込む
-fはコマンドライン全体に一致します。先にpgrep -fで対象を確認します。
PIDを間違えて別のプロセスを消す
PIDは使い回されます。killの直前にpsで確認します。
他ユーザーのプロセスを終了しようとする
権限がないとOperation not permittedになります。必要なら管理者権限で行います。
よくある質問
ps auxで全プロセスの一覧が表示されます。USER(実行ユーザー)・PID(プロセスID)・%CPU・%MEM・COMMANDなどの列があり、特定のプロセスを探すときはps aux | grep 名前で絞り込みます。リアルタイム監視ならtopです。killはTERM(終了要請)で、プロセスは後片付けをしてから終了できます。kill -9はKILL(強制終了)で、プロセスは拒否も無視もできず即座に止められますが、後片付けの猶予がありません。実機でも、TERMを無視するプロセスが-9でだけ終了することを確認しています。まずkill、効かなければ-9の順で使います。pkill -x プロセス名で、名前が完全一致するプロセスを終了できます。引数まで含めて指定したいときはpkill -f "パターン"を使いますが、コマンドライン全体に一致するため意図しないプロセスを巻き込む恐れがあります。先にpgrep -fで対象を確認してから実行してください。ps aux --sort=-%mem | headで、メモリ使用率の高い順に表示されます。CPUなら--sort=-%cpuです。「サーバーが重い」ときに、まずこれで原因の見当をつけるのが定番です。killで数秒待ち、それでも終了しない場合にだけ使ってください。まとめ
- プロセス一覧は
ps aux、絞り込みは| grep、重い順は--sort=-%mem。 - 終了は
kill PID。まず通常のkill、効かないときだけkill -9。 kill -9は後片付けの猶予が無い強制終了。使いどころは慎重に。- 名前で扱うなら
pgrep -x・pkill -x。-fは巻き込みに注意。 - 実行前に
pgrepで対象PIDを確認する習慣が安全です。
プロセスの確認と終了は、Linux運用の基本動作です。「ps auxで見て、killで止めて、ダメなら-9」という流れと、その理由(後片付けの猶予)を理解しておけば、固まったプログラムにも落ち着いて対処できます。pgrep・pkillも覚えて、効率よくプロセスを管理しましょう。

