このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
LinuC入門|コマンド演習05

LinuCコマンド演習05の概要
LinuCコマンド演習05では、1章で登場したコマンドについて、実際にAlmaLinuxのターミナルを操作しながら理解を深めます。
今回扱うのは、実行中のプロセスを検索したり、シグナルを送って終了させたりするための基本コマンドです。
| コマンド | 主な役割 | 主な指定方法 |
|---|---|---|
| kill | 指定したプロセスへシグナルを送る | PIDで指定する |
| pgrep | 条件に一致するプロセスを検索する | プロセス名やユーザー名で検索する |
| killall | 同じ名前のプロセスへまとめてシグナルを送る | プロセス名で指定する |
| pkill | 条件に一致するプロセスへシグナルを送る | 名前、ユーザー、正規表現などで指定する |
この表から分かるように、killはPIDを指定して個別に操作する場合に向いています。killallとpkillはプロセス名を使って複数のプロセスをまとめて操作できますが、pkillのほうがユーザー名などの細かな条件を指定できます。
pgrepはプロセスを終了するコマンドではありません。目的のプロセスを検索し、PIDやコマンドラインを確認するために使用します。
一般ユーザーは、基本的に自分が実行しているプロセスにだけシグナルを送れます。ほかのユーザーが所有するプロセスや、一部のシステムプロセスを操作するには、root権限が必要です。
ただし、rootでkillallやpkillを実行すると、重要なシステムプロセスまで終了させてしまう可能性があります。今回の演習ではrootを使用せず、suzukiが起動した練習用のsleepプロセスだけを操作します。
シグナルの基本
kill、killall、pkillは、プロセスを直接削除しているわけではありません。Linuxカーネルを通じて、対象のプロセスへシグナルを送ります。
シグナルは、プロセスに対して終了、停止、再開などを伝えるための仕組みです。
| シグナル名 | 番号 | 主な意味 |
|---|---|---|
| SIGHUP | 1 | 端末の切断を通知する。設定の再読み込みに使うプログラムもある |
| SIGTERM | 15 | 通常の終了を依頼する |
| SIGKILL | 9 | プロセスを強制終了する |
| SIGSTOP | 19 | プロセスを一時停止する |
| SIGCONT | 18 | 停止中のプロセスを再開する |
シグナルを指定しない場合、kill、killall、pkillは通常SIGTERMを送ります。SIGTERMは、プロセスが終了前の後処理を行えるシグナルです。
SIGKILLはプロセス側で受け取ったり無視したりできないため、強制的に終了させられます。その一方で、作業中のデータ保存や一時ファイルの削除などを行う機会を与えません。
そのため、基本的には次の順番で操作します。
- SIGTERMで通常終了を依頼する
- pgrepなどで終了したか確認する
- 終了しない場合に限ってSIGKILLを検討する
SIGTERMを優先する考え方は、killの公式マニュアルでも案内されています。
killコマンド
killは、PIDで指定したプロセスへシグナルを送るコマンドです。
基本書式
kill [オプション] PID基本的な使用例
| コマンド | 説明 |
|---|---|
| kill 3521 | PIDが3521のプロセスへSIGTERMを送る |
| kill -TERM 3521 | PIDが3521のプロセスへSIGTERMを送る |
| kill -15 3521 | シグナル番号でSIGTERMを指定する |
| kill -KILL 3521 | PIDが3521のプロセスへSIGKILLを送る |
| kill -9 3521 | シグナル番号でSIGKILLを指定する |
| kill -l | 使用できるシグナルの一覧を表示する |
kill 3521、kill -TERM 3521、kill -15 3521は、いずれもPIDが3521のプロセスへSIGTERMを送ります。
シグナル名を使う方法は、番号だけを指定する方法より意味を理解しやすいという利点があります。
killを使う基本的な流れ
suzuki@AlmaLinux:~$ pgrep -u suzuki -a sleep
3521 sleep 300
suzuki@AlmaLinux:~$ kill 3521
suzuki@AlmaLinux:~$ pgrep -u suzuki -a sleep最後のpgrepで何も表示されなければ、条件に一致するsleepプロセスは残っていません。
pgrepコマンド
pgrepは、実行中のプロセスを名前やユーザーなどの条件で検索し、条件に一致したPIDを表示するコマンドです。
基本書式
pgrep [オプション] 検索パターン主なオプション
| オプション | 説明 |
|---|---|
| -l | PIDとプロセス名を表示する |
| -a | PIDと完全なコマンドラインを表示する |
| -c | 一致したプロセスの数を表示する |
| -u ユーザー名 | 指定した実効ユーザーのプロセスに限定する |
| -x | プロセス名が完全に一致するものだけを検索する |
| -f | プロセス名だけでなく、完全なコマンドラインを検索する |
基本的な使用例
| コマンド | 説明 |
|---|---|
| pgrep sleep | 名前がsleepに一致するプロセスのPIDを表示する |
| pgrep -l sleep | PIDとプロセス名を表示する |
| pgrep -a sleep | PIDと完全なコマンドラインを表示する |
| pgrep -c sleep | 該当するsleepプロセスの数を表示する |
| pgrep -u suzuki sleep | suzukiが実行しているsleepを検索する |
| pgrep -u suzuki -a -x sleep | suzukiが実行しているsleepのPIDとコマンドラインを表示する |
pgrepで何も表示されない場合、条件に一致するプロセスが存在しないことを表します。検索結果が0件でも、通常は説明メッセージが表示されません。
killallコマンド
指定した名前で実行されているすべてのプロセスへシグナルを送るコマンドです。
基本書式
killall [オプション] プロセス名主な使用例
| コマンド | 説明 |
|---|---|
| killall sleep | 名前がsleepのすべてのプロセスへSIGTERMを送る |
| killall -TERM sleep | 名前がsleepのすべてのプロセスへSIGTERMを送る |
| killall -KILL sleep | 名前がsleepのすべてのプロセスへSIGKILLを送る |
| killall -u suzuki sleep | suzukiが所有するsleepへシグナルを送る |
| killall -i sleep | 対象ごとに確認してからシグナルを送る |
| killall -v sleep | シグナルを送った結果を表示する |
killallは同じ名前のプロセスをまとめて操作できるため便利ですが、終了する必要のないプロセスまで対象になる可能性があります。
実行前には、次のようにpgrepで対象を確認すると安全です。
suzuki@AlmaLinux:~$ pgrep -u suzuki -a -x sleep
4101 sleep 300
4102 sleep 300
suzuki@AlmaLinux:~$ killall sleepkillallはLinux以外のOSでは動作や意味が異なる場合があります。ここではAlmaLinuxで利用されるpsmisc版のkillallを前提にしています。
pkillコマンド
pkillは、名前やユーザーなどの条件に一致したプロセスへシグナルを送るコマンドです。
pgrepとpkillはよく似ていますが、処理内容が異なります。
| コマンド | 条件に一致したときの処理 |
|---|---|
| pgrep | PIDを表示する |
| pkill | シグナルを送る |
この表が示すように、pgrepは検索用、pkillは操作用です。同じ検索条件を使用できるため、最初にpgrepで対象を確認し、その後にpkillを実行できます。
基本書式
pkill [オプション] 検索パターン主な使用例
| コマンド | 説明 |
|---|---|
| pkill sleep | 名前がsleepに一致するプロセスへSIGTERMを送る |
| pkill -TERM sleep | 名前がsleepに一致するプロセスへSIGTERMを送る |
| pkill -KILL sleep | 名前がsleepに一致するプロセスへSIGKILLを送る |
| pkill -u suzuki sleep | suzukiが実行しているsleepへシグナルを送る |
| pkill -x sleep | プロセス名がsleepと完全に一致するものを対象にする |
| pkill -u suzuki -x sleep | 所有者がsuzukiで、名前がsleepと完全一致するものを対象にする |
pkillは複数の条件を組み合わせられます。例えば、pkill -u suzuki -x sleepでは、次の2つの条件を両方満たしたプロセスが対象です。
- 実効ユーザーがsuzukiである
- プロセス名がsleepと完全に一致する
4つのコマンドの使い分け
| やりたいこと | 使用するコマンド | 使用例 |
|---|---|---|
| プロセスを名前から探したい | pgrep | pgrep -a sleep |
| PIDを指定して1つ終了したい | kill | kill 3521 |
| 同じ名前のプロセスをまとめて終了したい | killall | killall sleep |
| ユーザーなどの条件を付けて終了したい | pkill | pkill -u suzuki -x sleep |
この表では、目的に応じたコマンドの選び方を整理しています。
対象が分かっていない場合は、まずpgrepを使います。PIDが判明し、1つだけ終了させるならkillが適しています。名前が同じ複数のプロセスをまとめて終了させる場合はkillall、名前以外の条件も指定したい場合はpkillを選びます。
演習問題+模範解答例

以下の演習では、練習用としてsleepコマンドをバックグラウンドで実行します。
sleepの末尾に付ける&は、コマンドをバックグラウンドで実行するための指定です。表示されるPIDは環境によって異なります。
演習01:pgrepコマンド(プロセスの検索)
問題
sleep 300をバックグラウンドで実行してください。
その後、suzukiが実行しているsleepプロセスについて、PIDと完全なコマンドラインを表示してください。確認が終わったら、表示されたPIDをkillに指定して終了してください。
模範解答例
suzuki@AlmaLinux:~$ sleep 300 &
[1] 3521
suzuki@AlmaLinux:~$ pgrep -u suzuki -a -x sleep
3521 sleep 300
suzuki@AlmaLinux:~$ kill 3521
suzuki@AlmaLinux:~$ pgrep -u suzuki -a -x sleep解説
sleep 300 &によって、300秒間待機するsleepプロセスをバックグラウンドで起動しています。
pgrepでは、次の条件を指定しています。
- -u suzukiで、suzukiのプロセスに限定する
- -aで、PIDと完全なコマンドラインを表示する
- -xで、プロセス名がsleepと完全に一致するものを検索する
最後のpgrepで何も表示されなければ、練習用のsleepプロセスは終了しています。
演習02:killコマンド(PIDを指定した通常終了)
問題
sleep 600をバックグラウンドで実行してください。
表示されたPIDを確認し、killコマンドを使ってSIGTERMを送ってください。その後、pgrepで終了したことを確認してください。
模範解答例
suzuki@AlmaLinux:~$ sleep 600 &
[1] 3601
suzuki@AlmaLinux:~$ pgrep -u suzuki -a -x sleep
3601 sleep 600
suzuki@AlmaLinux:~$ kill 3601
suzuki@AlmaLinux:~$ pgrep -u suzuki -a -x sleepSIGTERMを明示する場合は、次のように実行することもできます。
suzuki@AlmaLinux:~$ sleep 600 &
[1] 3605
suzuki@AlmaLinux:~$ kill -TERM 3605解説
killでシグナルを省略すると、SIGTERMが送られます。そのため、kill 3601とkill -TERM 3601は、基本的に同じ操作です。
PIDは環境によって変わるため、実際に表示された番号を指定してください。
演習03:killコマンド(SIGKILLによる強制終了)
問題
sleep 700をバックグラウンドで実行してください。
表示されたPIDを確認し、SIGKILLを送って強制終了してください。その後、pgrepでプロセスが終了したことを確認してください。
模範解答例
suzuki@AlmaLinux:~$ sleep 700 &
[1] 3701
suzuki@AlmaLinux:~$ pgrep -u suzuki -a -x sleep
3701 sleep 700
suzuki@AlmaLinux:~$ kill -KILL 3701
suzuki@AlmaLinux:~$ pgrep -u suzuki -a -x sleepシグナル番号を使用する場合は、次のようにも実行できます。
suzuki@AlmaLinux:~$ sleep 700 &
[1] 3705
suzuki@AlmaLinux:~$ kill -9 3705解説
SIGKILLは、プロセスを強制的に終了するシグナルです。プロセスはSIGKILLを無視できず、終了前の後処理もできません。
この演習ではシグナルの違いを確認するために使用しています。実際の運用では、最初にSIGTERMを送り、それでも終了しない場合にSIGKILLを検討します。
演習04:killallコマンド(同じ名前のプロセスを一括終了)
問題
次の2つのsleepプロセスをバックグラウンドで実行してください。
sleep 800
sleep 900pgrepで2つのプロセスを確認した後、killallを使って、名前がsleepのプロセスをまとめて終了してください。最後にpgrepで終了を確認してください。
この演習は、ほかに必要なsleepプロセスが動いていない学習環境で行ってください。
模範解答例
suzuki@AlmaLinux:~$ sleep 800 &
[1] 3801
suzuki@AlmaLinux:~$ sleep 900 &
[2] 3802
suzuki@AlmaLinux:~$ pgrep -u suzuki -a -x sleep
3801 sleep 800
3802 sleep 900
suzuki@AlmaLinux:~$ killall sleep
suzuki@AlmaLinux:~$ pgrep -u suzuki -a -x sleep解説
killall sleepは、プロセス名がsleepであるプロセスへSIGTERMを送ります。今回の例では、sleep 800とsleep 900の両方が対象になります。
killallはPIDを一つずつ調べなくても、同じ名前のプロセスをまとめて終了できます。ただし、終了させたくない同名プロセスまで対象になる可能性があるため、事前にpgrepで確認することが大切です。
演習05:pkillコマンド(ユーザーと名前を指定した終了)
問題
sleep 1000とsleep 1100をバックグラウンドで実行してください。
pgrepを使って、suzukiが実行しているsleepプロセスを確認してください。その後、pkillを使い、所有者がsuzukiでプロセス名がsleepと完全に一致するプロセスへSIGTERMを送ってください。
最後にpgrepで終了を確認してください。
模範解答例
suzuki@AlmaLinux:~$ sleep 1000 &
[1] 3901
suzuki@AlmaLinux:~$ sleep 1100 &
[2] 3902
suzuki@AlmaLinux:~$ pgrep -u suzuki -a -x sleep
3901 sleep 1000
3902 sleep 1100
suzuki@AlmaLinux:~$ pkill -TERM -u suzuki -x sleep
suzuki@AlmaLinux:~$ pgrep -u suzuki -a -x sleep解説
pkillでは、pgrepとよく似た検索条件を使用できます。
この例では、次の条件を指定しています。
- -TERMでSIGTERMを送る
- -u suzukiで、suzukiのプロセスに限定する
- -xで、プロセス名がsleepと完全に一致するものだけを対象にする
killall sleepより条件が細かいため、複数ユーザーが利用している環境では対象を限定しやすくなります。
演習06:pgrepコマンド(一致したプロセス数の確認)
問題
sleep 1200を3つバックグラウンドで実行してください。
pgrepを使って、suzukiが実行しているsleepプロセスの数を表示してください。その後、pkillを使って3つのsleepプロセスを終了し、もう一度プロセス数を確認してください。
模範解答例
suzuki@AlmaLinux:~$ sleep 1200 &
[1] 4001
suzuki@AlmaLinux:~$ sleep 1200 &
[2] 4002
suzuki@AlmaLinux:~$ sleep 1200 &
[3] 4003
suzuki@AlmaLinux:~$ pgrep -c -u suzuki -x sleep
3
suzuki@AlmaLinux:~$ pkill -u suzuki -x sleep
suzuki@AlmaLinux:~$ pgrep -c -u suzuki -x sleep
0解説
pgrepの-cは、条件に一致するPIDを並べる代わりに、プロセスの数を表示するオプションです。
最初の結果が3であれば、3つのsleepプロセスが動いています。pkillを実行した後の結果が0であれば、条件に一致するsleepプロセスは残っていません。
pgrep -cは一致数が0の場合でも0を表示します。ただし、コマンドの終了ステータスは、一致するプロセスがないことを表す1になります。
演習07:killコマンド(シグナル一覧の確認)
問題
killコマンドで利用できるシグナルの一覧を表示してください。
一覧からSIGTERMとSIGKILLを確認してください。
模範解答例
suzuki@AlmaLinux:~$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM表示内容は環境によって異なり、さらに多くのシグナルが表示されます。
解説
kill -lを実行すると、利用できるシグナル名と番号を確認できます。
今回の演習で特に重要なのは、次の2つです。
- SIGTERMは15で、通常終了を依頼する
- SIGKILLは9で、プロセスを強制終了する
番号だけを暗記するのではなく、通常はSIGTERMを使い、SIGKILLは最後の手段にするという使い分けも覚えておきましょう。
まとめ
LinuCコマンド演習05では、1章で登場したコマンドについて、プロセスの検索と終了に関する基本操作を演習しました。pgrepで対象を検索し、1つのPIDを指定する場合はkill、同じ名前のプロセスをまとめて終了する場合はkillall、ユーザー名などの条件を加える場合はpkillを使用します。実際の操作では、最初にpgrepで対象を確認し、SIGTERMで通常終了を依頼した後、もう一度pgrepで終了を確認する流れが大切です。SIGKILLは強力ですが後処理を行えないため、通常の方法で終了しない場合に限って使用しましょう。
