このページで解説している内容は、以下の 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カーネルを通じて、対象のプロセスへシグナルを送ります。

シグナルは、プロセスに対して終了、停止、再開などを伝えるための仕組みです。

シグナル名番号主な意味
SIGHUP1端末の切断を通知する。設定の再読み込みに使うプログラムもある
SIGTERM15通常の終了を依頼する
SIGKILL9プロセスを強制終了する
SIGSTOP19プロセスを一時停止する
SIGCONT18停止中のプロセスを再開する

シグナルを指定しない場合、kill、killall、pkillは通常SIGTERMを送ります。SIGTERMは、プロセスが終了前の後処理を行えるシグナルです。

SIGKILLはプロセス側で受け取ったり無視したりできないため、強制的に終了させられます。その一方で、作業中のデータ保存や一時ファイルの削除などを行う機会を与えません。

そのため、基本的には次の順番で操作します。

  1. SIGTERMで通常終了を依頼する
  2. pgrepなどで終了したか確認する
  3. 終了しない場合に限ってSIGKILLを検討する

SIGTERMを優先する考え方は、killの公式マニュアルでも案内されています。

killコマンド

killは、PIDで指定したプロセスへシグナルを送るコマンドです。

基本書式

kill [オプション] PID

基本的な使用例

コマンド説明
kill 3521PIDが3521のプロセスへSIGTERMを送る
kill -TERM 3521PIDが3521のプロセスへSIGTERMを送る
kill -15 3521シグナル番号でSIGTERMを指定する
kill -KILL 3521PIDが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 [オプション] 検索パターン

主なオプション

オプション説明
-lPIDとプロセス名を表示する
-aPIDと完全なコマンドラインを表示する
-c一致したプロセスの数を表示する
-u ユーザー名指定した実効ユーザーのプロセスに限定する
-xプロセス名が完全に一致するものだけを検索する
-fプロセス名だけでなく、完全なコマンドラインを検索する

基本的な使用例

コマンド説明
pgrep sleep名前がsleepに一致するプロセスのPIDを表示する
pgrep -l sleepPIDとプロセス名を表示する
pgrep -a sleepPIDと完全なコマンドラインを表示する
pgrep -c sleep該当するsleepプロセスの数を表示する
pgrep -u suzuki sleepsuzukiが実行しているsleepを検索する
pgrep -u suzuki -a -x sleepsuzukiが実行しているsleepのPIDとコマンドラインを表示する

pgrepで何も表示されない場合、条件に一致するプロセスが存在しないことを表します。検索結果が0件でも、通常は説明メッセージが表示されません。

killallコマンド

指定した名前で実行されているすべてのプロセスへシグナルを送るコマンドです。

基本書式

killall [オプション] プロセス名

主な使用例

コマンド説明
killall sleep名前がsleepのすべてのプロセスへSIGTERMを送る
killall -TERM sleep名前がsleepのすべてのプロセスへSIGTERMを送る
killall -KILL sleep名前がsleepのすべてのプロセスへSIGKILLを送る
killall -u suzuki sleepsuzukiが所有する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 sleep

killallはLinux以外のOSでは動作や意味が異なる場合があります。ここではAlmaLinuxで利用されるpsmisc版のkillallを前提にしています。

pkillコマンド

pkillは、名前やユーザーなどの条件に一致したプロセスへシグナルを送るコマンドです。

pgrepとpkillはよく似ていますが、処理内容が異なります。

コマンド条件に一致したときの処理
pgrepPIDを表示する
pkillシグナルを送る

この表が示すように、pgrepは検索用、pkillは操作用です。同じ検索条件を使用できるため、最初にpgrepで対象を確認し、その後にpkillを実行できます。

基本書式

pkill [オプション] 検索パターン

主な使用例

コマンド説明
pkill sleep名前がsleepに一致するプロセスへSIGTERMを送る
pkill -TERM sleep名前がsleepに一致するプロセスへSIGTERMを送る
pkill -KILL sleep名前がsleepに一致するプロセスへSIGKILLを送る
pkill -u suzuki sleepsuzukiが実行しているsleepへシグナルを送る
pkill -x sleepプロセス名がsleepと完全に一致するものを対象にする
pkill -u suzuki -x sleep所有者がsuzukiで、名前がsleepと完全一致するものを対象にする

pkillは複数の条件を組み合わせられます。例えば、pkill -u suzuki -x sleepでは、次の2つの条件を両方満たしたプロセスが対象です。

  • 実効ユーザーがsuzukiである
  • プロセス名がsleepと完全に一致する

4つのコマンドの使い分け

やりたいこと使用するコマンド使用例
プロセスを名前から探したいpgreppgrep -a sleep
PIDを指定して1つ終了したいkillkill 3521
同じ名前のプロセスをまとめて終了したいkillallkillall sleep
ユーザーなどの条件を付けて終了したいpkillpkill -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 sleep

SIGTERMを明示する場合は、次のように実行することもできます。

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 900

pgrepで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は強力ですが後処理を行えないため、通常の方法で終了しない場合に限って使用しましょう。