LinuC入門|Linuxでプロセスとジョブを停止する方法

プロセスを正しく見分け、適切なシグナルで安全に停止する。Linuxの実行管理を基礎から身につけよう。

Linuxを操作していると、実行したコマンドがなかなか終了しなかったり、バックグラウンドで動かしている処理を途中で止めたくなったりすることがあります。

このようなときに使用するのがkillコマンドです。

killという名前から、プロセスを強制的に終了させるだけのコマンドに見えるかもしれません。しかし、killの本来の役割は、指定したプロセスやジョブへシグナルを送信することです。

シグナルとは、実行中のプロセスに対して、終了、一時停止、割り込み、設定の再読み込みなどを伝えるための通知です。どのシグナルを送るかによって、プロセスに指示する内容が変わります。

たとえば、通常の終了を促すときはTERMシグナルを使用します。それでも終了できない場合は、KILLシグナルによる強制終了を検討します。ただし、KILLシグナルではプロセスが終了前の処理を行えないため、最初から使用するのはおすすめできません。

この記事ではAlmaLinux 10.2を使用し、一般ユーザーsuzukiとrootユーザーによる操作例を見ながら、プロセスとジョブを安全に停止する方法を詳しく解説します。

プロセスとジョブの違い

プロセスとジョブは似ていますが、管理している範囲が異なります。

用語説明
プロセスLinux上で実行されているプログラムの単位
PIDLinuxが各プロセスへ割り当てる識別番号
ジョブシェルが管理しているコマンドの実行単位
ジョブ番号シェルがジョブへ割り当てる番号
シグナルプロセスへ終了や停止などを伝える通知

プロセスはLinuxシステムによって管理され、各プロセスにはPIDが割り当てられます。PIDはプロセスIDを意味し、実行中のプロセスを識別するために使用します。

一方、ジョブは現在操作しているシェルによって管理されます。コマンドをバックグラウンドで実行すると、ジョブ番号とPIDが表示されます。

suzuki@AlmaLinux:~$ sleep 300 &
[1] 6214

この表示では、次のように読み取ります。

  • 1はジョブ番号
  • 6214はPID
  • &はコマンドをバックグラウンドで実行する指定

ジョブ番号をkillコマンドで指定するときは、%1のように番号の前へ%を付けます。

sleepコマンドの書式

sleep 時間

sleepコマンドは、指定した時間だけ処理を待機するコマンドです。この記事では、動作確認用のプロセスを一定時間実行しておくために使用します。

suzuki@AlmaLinux:~$ sleep 300

この例では、sleepプロセスが300秒間待機します。

sleepコマンドのオプション

この記事の使用例では、sleepコマンドにオプションを指定しません。300などの数値はオプションではなく、待機時間を表す引数です。

指定説明
時間待機する時間を指定する。単位を省略した場合は秒として扱われる

図1:プロセス・ジョブ・シグナルの関係

この図から分かること

実行したコマンドはプロセスとしてLinuxに管理され、PIDが割り当てられます。バックグラウンドで実行したコマンドは、同時にシェルのジョブとしても管理されます。

そのため、killコマンドでは、PIDを使ってプロセスを指定する方法と、%を付けたジョブ番号でジョブを指定する方法があります。

killコマンドとは

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

シグナルを指定しなかった場合は、既定でTERMシグナルが送信されます。TERMはプロセスに通常の終了を促すシグナルです。

killコマンドの書式

kill [オプション] PID
kill [オプション] %ジョブ番号

複数のPIDを指定する場合は、空白で区切って並べます。

killコマンドの主なオプション

オプション説明
-s シグナル送信するシグナルを名前または番号で指定する
-9KILLシグナルを送信し、プロセスを強制終了する

-sでは、次のようにシグナル名を指定できます。

kill -s TERM 6214

番号を使用する場合は、次のように指定できます。

kill -s 15 6214

どちらもPID 6214へTERMシグナルを送る指定です。

killコマンドの引数

引数説明
PIDシグナルを送信するプロセスのPIDを指定する
%ジョブ番号シグナルを送信するジョブの番号を指定する

PIDを指定する場合は6214のように番号だけを記述します。ジョブ番号を指定する場合は%1のように%を付けます。

Linuxでよく使用するシグナル

AlmaLinux 10.2の一般的なx86_64環境では、次のシグナルをよく使用します。

番号短い名前正式な名前主な役割
1HUPSIGHUP対応しているプログラムに設定の再読み込みなどを指示する
2INTSIGINT実行中の処理へ割り込みを指示する
9KILLSIGKILLプロセスを強制終了する
15TERMSIGTERMプロセスに通常の終了を促す
20TSTPSIGTSTP端末からプロセスの一時停止を指示する

TERMとSIGTERMは別のシグナルではありません。SIGはシグナル名であることを示す接頭辞であり、killコマンドではSIGを省略してTERMと指定できます。

同じように、KILLとSIGKILL、INTとSIGINT、TSTPとSIGTSTPも、それぞれ同じシグナルを表しています。

ただし、HUPを受け取ったときに設定を再読み込みするかどうかは、プログラムによって異なります。すべてのプロセスがHUPによる設定再読み込みに対応しているわけではありません。

PIDを調べてプロセスを停止する

バックグラウンドで実行したsleepプロセスを、PIDを指定して停止してみましょう。

まず、sleepコマンドを300秒間実行します。

suzuki@AlmaLinux:~$ sleep 300 &
[1] 6214

psコマンドとgrepコマンドを組み合わせて、sleepプロセスを確認します。

suzuki@AlmaLinux:~$ ps ax | grep sleep
   6214 pts/0    S      0:00 sleep 300
   6218 pts/0    S+     0:00 grep sleep

PID 6214が停止対象となるsleepプロセスです。

jobsコマンドでも確認してみましょう。

suzuki@AlmaLinux:~$ jobs
[1]+  実行中               sleep 300 &

PID 6214へ既定のTERMシグナルを送ります。

suzuki@AlmaLinux:~$ kill 6214

シグナルを省略しているため、この操作ではTERMシグナルが送られます。

ジョブの終了通知が表示されます。

[1]+  Terminated              sleep 300

もう一度プロセスを確認します。

suzuki@AlmaLinux:~$ ps ax | grep sleep
   6225 pts/0    S+     0:00 grep sleep

sleepプロセスは表示されず、検索に使用したgrepプロセスだけが表示されています。

jobsコマンドでも確認します。

suzuki@AlmaLinux:~$ jobs
suzuki@AlmaLinux:~$

何も表示されなければ、現在のシェルが管理しているジョブは残っていません。

psコマンドとは

psコマンドは、Linux上で動作しているプロセスの情報を表示するコマンドです。

psコマンドの書式

ps [オプション]

この記事では、次の形式を使用します。

ps ax

psコマンドの主なオプション

オプション説明
a端末に関連付けられたほかのユーザーのプロセスも表示対象にする
x端末に関連付けられていないプロセスも表示対象にする

psでは、オプションの指定形式が複数あります。この記事で使用するaxは、ハイフンを付けないBSD形式の指定です。

grepコマンドとは

grepコマンドは、入力された文字列の中から、指定したパターンに一致する行を検索するコマンドです。

grepコマンドの書式

grep [オプション] 検索文字列

この記事では、ps axの出力からsleepを含む行だけを取り出します。

ps ax | grep sleep

|は、左側のコマンドの出力を右側のコマンドへ渡すための記号です。

grepコマンドのオプション

この記事のgrepコマンドでは、オプションを指定しません。

指定説明
sleepsleepという文字列を含む行を検索する

grep自身の実行行にもsleepという文字列が含まれるため、検索結果にはgrep sleepも表示されます。停止するPIDを選ぶときは、grep自身のPIDを間違えて指定しないようにしましょう。

jobsコマンドとは

jobsコマンドは、現在のシェルが管理しているジョブの状態を表示するコマンドです。

jobsコマンドの書式

jobs [ジョブ番号]

この記事では、引数やオプションを付けずに実行します。

suzuki@AlmaLinux:~$ jobs

jobsコマンドのオプション

この記事のjobsコマンドでは、オプションを指定しません。

指定説明
オプションなし現在のシェルが管理しているジョブを表示する

jobsが表示するのは、現在操作しているシェルのジョブです。別のターミナルで実行されたプロセスや、別のユーザーが実行したプロセスは表示されません。

ジョブ番号を指定して停止する

killコマンドでは、PIDだけでなくジョブ番号も指定できます。

新しいsleepプロセスをバックグラウンドで実行します。

suzuki@AlmaLinux:~$ sleep 600 &
[2] 6250

ジョブの状態を確認します。

suzuki@AlmaLinux:~$ jobs
[2]+  実行中               sleep 600 &

ジョブ番号2へTERMシグナルを送ります。

suzuki@AlmaLinux:~$ kill -s TERM %2

終了通知が表示されます。

[2]+  Terminated              sleep 600

%2はPID 2ではなく、現在のシェルが管理しているジョブ番号2を表します。

ジョブ番号はシェルごとに管理されます。そのため、別のターミナルを開いてkill -s TERM %2を実行しても、元のターミナルのジョブ番号2を操作することはできません。

TERMシグナルで通常終了を促す

kill、killall、pkillでは、シグナルを省略すると既定でTERMシグナルが送られます。

次の2つのkillコマンドは、同じ意味になります。

kill 6250
kill -s TERM 6250

TERMシグナルを受信したプロセスは、プログラム側に終了処理が用意されていれば、次のような作業を行ってから終了できます。

  • 使用しているファイルを閉じる
  • 処理中のデータを書き出す
  • 一時ファイルを削除する
  • 終了状態を記録する
  • 関連する処理を停止する

ただし、TERMシグナルは通常終了の要求です。プロセスがTERMを受け取ったからといって、必ず正常終了するとは限りません。

プロセスがTERMを無視するように作られていたり、処理が応答しない状態になっていたりすると、終了しないことがあります。

KILLシグナルで強制終了する

TERMシグナルを送っても終了しない場合は、KILLシグナルによる強制終了を検討します。

suzuki@AlmaLinux:~$ kill -9 6250

ジョブ番号を指定する場合は、次のように実行します。

suzuki@AlmaLinux:~$ kill -9 %2

KILLシグナルはプロセス側で捕捉、拒否、無視できません。そのため、プロセスは終了前の後片付けを行えません。

強制終了すると、次のような問題が発生する可能性があります。

  • 書き込み途中のファイルが不完全な状態で残る
  • 一時ファイルが削除されずに残る
  • 処理中のデータが失われる
  • ファイルやデータの状態に不整合が生じる
  • 障害原因を示すログが十分に記録されない

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

  1. psなどで停止対象を確認する
  2. killでTERMシグナルを送る
  3. プロセスが終了したか確認する
  4. 終了しない場合に原因を確認する
  5. ほかに安全な方法がない場合のみKILLシグナルを使用する

図2:TERMとKILLによる停止方法の違い

この図から分かること

TERMはプロセスに終了を依頼するシグナルであり、プロセスが終了前の処理を行える可能性があります。

一方、KILLはプロセスを強制的に終了させます。処理中のデータやファイルを保護するためにも、最初はTERMを使用し、KILLは最後の手段として利用することが大切です。

Ctrl + Cで実行中の処理を中断する

端末上で動作し続けるコマンドを中断するときは、Ctrl + Cを使用できます。

Ctrl + Cを押すと、端末でフォアグラウンド実行されている処理へINTシグナルが送られます。

ここではrootユーザーに切り替え、tailコマンドでログファイルの末尾を表示し続けます。

suzuki@AlmaLinux:~$ su -
パスワード:
root@AlmaLinux:~#

tail -fでログの監視を開始します。

root@AlmaLinux:~# tail -f /var/log/dnf.log
2026-08-12T15:42:18+0900 INFO --- logging initialized ---
2026-08-12T15:42:20+0900 INFO Last metadata expiration check completed.

tail -fは新しい行が追加されるのを待ち続けるため、そのままではプロンプトに戻りません。

ここでCtrl + Cを押します。

^C
root@AlmaLinux:~#

Ctrl + CによってtailへINTシグナルが送られ、処理が終了します。

なお、Ctrl + Cはすべてのプロセスを無条件に終了させる操作ではありません。基本的には、その端末でフォアグラウンド実行されているプロセスグループへINTシグナルを送ります。

suコマンドとは

suコマンドは、現在のログインセッション内で別のユーザーへ切り替えるコマンドです。

suコマンドの書式

su [オプション] [ユーザー名]

ユーザー名を省略した場合は、rootユーザーへの切り替えを試みます。

suコマンドの主なオプション

オプション説明
-切り替え先ユーザーとしてログインした場合と同様の環境を読み込む

次のように実行すると、rootユーザーのログイン環境へ切り替わります。

suzuki@AlmaLinux:~$ su -
パスワード:
root@AlmaLinux:~#

tailコマンドとは

tailコマンドは、ファイルの末尾部分を表示するコマンドです。ログファイルの直近の内容を確認するときによく使用します。

tailコマンドの書式

tail [オプション] ファイル名

tailコマンドの主なオプション

オプション説明
-fファイルの末尾を表示した後、新しいデータが追加されると続けて表示する

使用例は次のとおりです。

root@AlmaLinux:~# tail -f /var/log/dnf.log

監視を終了するときはCtrl + Cを押します。

Ctrl + Zによる一時停止

Ctrl + Zを押すと、フォアグラウンドで実行されている処理へTSTPシグナルが送られます。

TSTPはプロセスを終了させるシグナルではありません。処理を一時停止させるシグナルです。

suzuki@AlmaLinux:~$ sleep 900
^Z
[3]+  停止                  sleep 900
suzuki@AlmaLinux:~$

ジョブの状態を確認します。

suzuki@AlmaLinux:~$ jobs
[3]+  停止                  sleep 900

この状態では、sleepプロセスは終了していません。停止状態のままシステム上に残っています。

不要なジョブであれば、ジョブ番号を指定してTERMシグナルを送ります。

suzuki@AlmaLinux:~$ kill -s TERM %3

Ctrl + CとCtrl + Zの違いを整理すると、次のようになります。

キー操作送られるシグナル主な動作
Ctrl + CINT・2番実行中の処理へ割り込みを指示する
Ctrl + ZTSTP・20番実行中の処理を一時停止する

killallコマンドとは

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

同じ名前のプロセスが複数存在する場合は、それらがまとめて対象になります。シグナルを省略した場合はTERMが送信されます。Linuxのkillallマニュアルでも、指定した名前で実行されているすべてのプロセスへシグナルを送る仕様が示されています。

killallコマンドの書式

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

killallコマンドの主なオプション

オプション説明
-s シグナル送信するシグナルを名前または番号で指定する。省略時はTERM

killallコマンドの引数

引数説明
プロセス名シグナルを送るプロセスの名前を指定する

killallで同名プロセスを停止する

sleepプロセスを2つバックグラウンドで実行します。

suzuki@AlmaLinux:~$ sleep 400 &
[4] 6311
suzuki@AlmaLinux:~$ sleep 500 &
[5] 6312

pgrepコマンドでsleepという名前のプロセスを確認します。

suzuki@AlmaLinux:~$ pgrep -l sleep
6311 sleep
6312 sleep

jobsコマンドでも確認します。

suzuki@AlmaLinux:~$ jobs
[4]-  実行中               sleep 400 &
[5]+  実行中               sleep 500 &

killallでsleepという名前のプロセスへTERMシグナルを送ります。

suzuki@AlmaLinux:~$ killall -s TERM sleep

終了通知が表示されます。

[4]-  Terminated              sleep 400
[5]+  Terminated              sleep 500

もう一度pgrepを実行します。

suzuki@AlmaLinux:~$ pgrep -l sleep

何も表示されなければ、sleepという名前のプロセスは見つかっていません。

jobsでも確認します。

suzuki@AlmaLinux:~$ jobs
suzuki@AlmaLinux:~$

killallは、指定した名前に一致するプロセスをまとめて対象にします。停止してはいけない同名プロセスが存在しないか、実行前に確認することが大切です。

pgrepコマンドとは

pgrepコマンドは、指定した名前やキーワードに一致するプロセスを検索し、PIDを表示するコマンドです。

killallやpkillを実行する前にpgrepを使用すると、どのプロセスが対象になるのかを確認できます。

pgrepコマンドの書式

pgrep [オプション] キーワード

pgrepコマンドの主なオプション

オプション説明
-lPIDと一緒にプロセス名を表示する

使用例は次のとおりです。

suzuki@AlmaLinux:~$ pgrep -l sleep
6311 sleep
6312 sleep

PIDだけでなくプロセス名も表示されるため、停止対象を確認しやすくなります。

pkillコマンドとは

pkillコマンドは、指定したキーワードに一致するプロセスを検索し、シグナルを送るコマンドです。

killallは主にプロセス名を指定して使用しますが、pkillのキーワードは検索パターンとして扱われます。そのため、指定方法によっては複数のプロセスが一致します。

pkillコマンドの書式

pkill [オプション] キーワード

pkillでシグナルを指定する方法

シグナルは次の形式で指定します。

pkill -シグナル キーワード
pkill -シグナル番号 キーワード

主な指定方法は次のとおりです。

オプション説明
-TERMTERMシグナルを送信する
-1515番のTERMシグナルを送信する
-KILLKILLシグナルを送信する
-99番のKILLシグナルを送信する

pkillでシグナルを省略した場合も、既定ではTERMが送信されます。

注意したいのは、pkillの -s はシグナル指定ではないことです。AlmaLinuxで使用されるpkillでは、-sはセッションIDによって対象を絞り込むためのオプションです。シグナル指定としてpkill -s TERMのように実行してはいけません。pgrep・pkillのマニュアルでも、シグナルは-TERMのような形式、-sはセッション指定として定義されています。

pkillコマンドの引数

引数説明
キーワード検索対象となるプロセス名のパターンを指定する

pkillでキーワードに一致するプロセスを停止する

sleepプロセスを2つバックグラウンドで実行します。

suzuki@AlmaLinux:~$ sleep 700 &
[6] 6361
suzuki@AlmaLinux:~$ sleep 800 &
[7] 6362

最初にpgrepで対象を確認します。

suzuki@AlmaLinux:~$ pgrep -l sleep
6361 sleep
6362 sleep

pkillでsleepに一致するプロセスへTERMシグナルを送ります。

suzuki@AlmaLinux:~$ pkill -TERM sleep

シグナルを省略し、次のように実行しても既定のTERMが送信されます。

suzuki@AlmaLinux:~$ pkill sleep

停止後の状態を確認します。

suzuki@AlmaLinux:~$ pgrep -l sleep

何も表示されなければ、条件に一致するsleepプロセスは見つかっていません。

kill・killall・pkillの違い

3つのコマンドは、いずれもプロセスへシグナルを送信します。大きな違いは、停止対象の指定方法です。

コマンド対象の指定方法適している場面注意点
killPIDまたはジョブ番号停止対象を個別に指定したい場合PIDやジョブ番号の指定間違いに注意する
killallプロセス名同じ名前のプロセスをまとめて停止したい場合同名のプロセスが複数あると、すべて対象になる
pkillキーワード名前のパターンに一致するプロセスを停止したい場合キーワードが広すぎると、意図しないプロセスも対象になる

停止対象のPIDが分かっている場合は、killを使用する方法が分かりやすく、対象も限定しやすくなります。

killallやpkillは複数のプロセスをまとめて停止できるため便利ですが、実行前にpgrepで対象を確認することが大切です。

図3:kill・killall・pkillの使い分け

この図から分かること

killはPIDまたはジョブ番号を使って対象を指定します。停止させたいプロセスが明確な場合に適しています。

killallは同じ名前を持つプロセスをまとめて対象にし、pkillはキーワードに一致するプロセスを対象にします。killallとpkillは一度に複数のプロセスへ影響する可能性があるため、事前確認が特に重要です。

プロセスを停止するときの注意点

プロセスを停止するときは、次の点を意識すると安全に操作できます。

  • 最初にpsやpgrepで停止対象を確認する
  • PIDとプロセス名が正しいことを確認する
  • 通常は既定のTERMシグナルから試す
  • TERMを送った後は、プロセスが終了したか確認する
  • KILLシグナルはTERMで終了できない場合の最終手段とする
  • killallやpkillでは、複数のプロセスが対象になることを意識する
  • Ctrl + CはINTによる割り込みであることを理解する
  • Ctrl + Zは終了ではなく一時停止であることを理解する
  • 一般ユーザーは、基本的に自分が所有するプロセスだけを停止できる
  • rootで実行するときは、影響する範囲を慎重に確認する

特にrootユーザーでkillallやpkillを実行すると、一般ユーザーで実行する場合よりも広い範囲のプロセスへシグナルを送れる可能性があります。

名前やキーワードだけを見てすぐに実行せず、pgrep -lで対象を確認してから停止操作を行いましょう。