killallコマンドとは?Linuxでプロセス名を指定してまとめて終了する方法

Linux

Linuxで同じ名前のプロセスが複数動いているとき、PIDを一つずつ調べてkillコマンドを実行するのは少し面倒です。

「同じ名前のプロセスをまとめて終了したい」という場面で使えるのが、killallコマンドです。

killallコマンドを使うと、PIDではなくプロセス名を指定して、同名のプロセスへまとめてシグナルを送信できます。

ただし、指定した名前に一致する複数のプロセスが対象になるため、確認せずに実行すると必要な処理まで停止してしまう可能性があります。

この記事では、Linux初心者向けに、killallコマンドの基本的な使い方、SIGTERM・SIGKILLなどのシグナル指定、対象プロセスの確認方法、kill・pkillとの違い、安全に使うための注意点まで分かりやすく解説します。

killallコマンドとは

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

例えば、sample-appという名前のプロセスを終了したい場合は、次のように実行します。

killall sample-app

同じ名前のプロセスが複数存在する場合は、通常、そのすべてが対象になります。

前回紹介したkillコマンドがPIDを指定するのに対し、killallではプロセス名を指定します。

コマンド 指定方法
kill PIDを指定してシグナルを送信する
killall プロセス名を指定してシグナルを送信する

なお、killallという名前でも、必ず強制終了するわけではありません。

シグナルを省略した場合は、通常、正常終了を要求するSIGTERMが送信されます。

killallコマンドの基本構文

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

最も基本的な使い方は次のとおりです。

killall sample-app

このコマンドを実行すると、名前がsample-appに一致するプロセスへSIGTERMが送信されます。

複数のプロセス名をまとめて指定することもできます。

killall sample-app test-app

この場合、sample-apptest-appの両方が対象になります。

実行前に対象プロセスを確認する

killallは、同名のプロセスをまとめて対象にします。

そのため、実行前にpgreppsで対象を確認することが大切です。

pgrep -a -x sample-app

実行例

2458 /usr/local/bin/sample-app
2461 /usr/local/bin/sample-app
2464 /usr/local/bin/sample-app

表示されたすべてのプロセスを終了してよいことを確認してから、killallを実行します。

killall sample-app

実行後は、同じコマンドでもう一度確認しましょう。

pgrep -a -x sample-app

何も表示されなければ、名前が一致するプロセスは残っていません。

ただし、systemdや監視ツールによって自動再起動される設定では、終了直後に新しいPIDで起動する場合があります。

killallはデフォルトでSIGTERMを送信する

シグナルを省略した場合、killallは通常SIGTERMを送信します。

killall sample-app

次の書き方も同じ意味です。

killall -TERM sample-app

シグナル番号で指定する場合は次のように実行します。

killall -15 sample-app

SIGTERMは、対象プロセスへ正常終了を要求するシグナルです。

プロセス側は、データの保存、一時ファイルの削除、接続の切断など、必要な終了処理を行ってから停止できます。

そのため、プロセスを終了するときは、まずSIGTERMを使用するのが基本です。

強制終了する方法

SIGTERMを送ってもプロセスが終了しない場合は、SIGKILLを送信できます。

killall -KILL sample-app

シグナル番号を使う場合は次のとおりです。

killall -9 sample-app

SIGKILLは、プロセス側で無視できない強制終了シグナルです。

終了処理を行う時間が与えられないため、次のような問題が発生する可能性があります。

  • 未保存データが失われる
  • 一時ファイルやロックファイルが残る
  • 処理中のデータが不整合を起こす
  • 通信やデータベース接続が突然切断される
  • 正常な終了ログが残らない

最初からkillall -9を使わず、まずSIGTERMで正常終了を試してください。

SIGTERMを送ったあとは、対象プロセスの終了処理に必要な時間を待ち、ログや状態を確認してからSIGKILLを検討しましょう。

送信するシグナルを指定する

killallでは、送信するシグナルを名前または番号で指定できます。

killall -TERM sample-app
killall -HUP sample-app
killall -STOP sample-app
killall -CONT sample-app

代表的なシグナルは次のとおりです。

シグナル 一般的な用途
SIGHUP 設定の再読み込みなどを要求する
SIGTERM 正常終了を要求する
SIGKILL 強制終了する
SIGSTOP プロセスを一時停止する
SIGCONT 停止中のプロセスを再開する

SIGHUPを受け取ったときの動作などは、プログラムごとに異なります。

設定の再読み込みに利用する場合は、対象ソフトウェアの公式ドキュメントを確認してください。

利用できるシグナルを確認する

killallで利用できるシグナルは、次のコマンドで確認できます。

killall -l

環境によっては、killコマンドでも一覧を確認できます。

kill -l

数字だけでは意味が分かりにくいため、手順書やシェルスクリプトでは-TERM-KILLのように名前で指定すると読みやすくなります。

確認しながら終了する

-iオプションを付けると、対象プロセスごとに確認してからシグナルを送信できます。

killall -i sample-app

確認メッセージが表示されたら、内容を確認して操作します。

Kill sample-app(2458) ? (y/N)

誤って複数のプロセスを終了するのが不安な場合に便利です。

ただし、対象が多い場合は一件ずつ確認が必要になるため、自動処理には向いていません。

終了したプロセスを表示する

-vオプションを使用すると、シグナルを送信したプロセスの情報を表示できます。

killall -v sample-app

実行例

Killed sample-app(2458) with signal 15
Killed sample-app(2461) with signal 15

どのプロセスが対象になったのかを確認しながら操作したい場合に便利です。

なお、表示内容はkillallのバージョンや環境によって異なる場合があります。

指定ユーザーのプロセスだけを対象にする

-uオプションを使うと、指定したユーザーが実行しているプロセスだけを対象にできます。

killall -u user01 sample-app

この例では、user01が実行しているsample-appだけにシグナルを送信します。

複数ユーザーが同じ名前のプログラムを実行している環境では、ユーザーを指定することで誤操作を防ぎやすくなります。

実行前には、同じ条件に近い形で対象を確認しておきましょう。

pgrep -a -u user01 -x sample-app

大文字と小文字を区別せずに検索する

通常、プロセス名の大文字と小文字は区別されます。

-Iオプションを使用すると、大文字と小文字を区別せずに一致させられます。

killall -I sample-app

ただし、検索範囲が広がるため、似た名前のプロセスを誤って対象にしないよう注意してください。

正規表現でプロセス名を指定する

-rオプションを使うと、プロセス名を正規表現で指定できます。

killall -r '^sample-.*'

この例では、名前がsample-から始まるプロセスが対象になります。

正規表現は複数のプロセスへ一致しやすいため、いきなり終了するのは危険です。

事前にpsやpgrepなどを使い、対象となるプロセス名を十分に確認してください。

kill・pkill・killallの違い

Linuxには、プロセスへシグナルを送るコマンドが複数あります。

コマンド 指定方法 向いている用途
kill PIDを指定 特定のプロセスだけを確実に操作したい
pkill プロセス名やユーザーなど条件指定 条件に一致するプロセスを終了したい
killall プロセス名を指定 同名プロセスをまとめて終了したい

PIDが分かっている場合はkill、条件を指定したい場合はpkill、同じ名前のプロセスをまとめて終了したい場合はkillallが便利です。

systemctlとの使い分け

NginxやApache、MySQLなど、systemdで管理されているサービスは、killallではなくsystemctlを利用するのが基本です。

sudo systemctl stop nginx

systemctlを利用すると、サービス管理や依存関係、ログ管理も含めた安全な停止が行えます。

killallは、一時的に起動したプログラムや、systemd管理外のプロセスを終了したい場合に適しています。

シェルスクリプトで利用する例

対象プロセスが存在する場合だけkillallを実行する例です。

if pgrep -x sample-app > /dev/null; then
    killall sample-app
fi

このように記述すると、存在しないプロセスへ不要なシグナルを送ることを防げます。

killallコマンドが使えない場合

ディストリビューションによっては、killallコマンドが標準でインストールされていない場合があります。

多くのLinuxディストリビューションでは、psmiscパッケージに含まれています。

UbuntuやDebianでは、次のようにインストールできます。

sudo apt install psmisc

RHEL系では次のようにインストールできます。

sudo dnf install psmisc

インストール後は、次のコマンドで利用できることを確認しましょう。

killall --version

よくあるエラー

No process foundが表示される

指定した名前のプロセスが存在しない可能性があります。

まずはpgrepで対象を確認してください。

pgrep -a sample-app

Permission deniedが表示される

他ユーザーが実行しているプロセスへシグナルを送信する権限がない可能性があります。

必要に応じてsudoを利用してください。

sudo killall sample-app

終了しない

SIGTERMを無視している、または終了処理に時間がかかっている可能性があります。

ログやプロセス状態を確認し、それでも終了しない場合だけSIGKILLを検討してください。

すぐにプロセスが復活する

systemdや監視ツールによって自動再起動されている可能性があります。

サービス管理対象の場合は、killallではなくsystemctlで停止しましょう。

sudo systemctl stop sample-app

よくある質問

killallは強制終了コマンドですか?

いいえ。

シグナルを省略した場合は通常SIGTERMが送信され、正常終了を要求します。

killallとpkillの違いは何ですか?

killallは主にプロセス名を指定します。

pkillはユーザーや親プロセス、正規表現など、より細かい条件を指定できます。

killall -9は使っても大丈夫ですか?

最終手段として利用してください。

まずは通常のkillallでSIGTERMを送り、それでも終了しない場合だけSIGKILLを利用しましょう。

systemctl管理のサービスにもkillallを使えますか?

使えますが、通常はsystemctl stopを利用する方が安全です。

複数の同名プロセスがある場合はどうなりますか?

通常は、指定した名前に一致するすべてのプロセスが対象になります。

実行前にpgrep -aで確認することをおすすめします。

まとめ

killallコマンドは、Linuxで同じ名前のプロセスへまとめてシグナルを送信できる便利なコマンドです。

特に次のコマンドは覚えておくと役立ちます。

コマンド 用途
killall sample-app SIGTERMで終了する
killall -KILL sample-app 強制終了する
killall -HUP sample-app 設定の再読み込みを要求する
killall -u user01 sample-app 指定ユーザーのみ終了する
killall -i sample-app 確認しながら終了する
killall -v sample-app 終了したプロセスを表示する

killallは非常に便利ですが、同名のプロセスをまとめて終了する可能性があります。

実運用では「pgrepで確認 → killallを実行 → pgrepで再確認」という流れを習慣にすると、安全にプロセスを管理できます。

コメント

タイトルとURLをコピーしました