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

Linux

Linuxで動かなくなったプログラムを終了するとき、PIDを調べてからkillコマンドを実行する方法があります。

ただ、「PIDを毎回調べるのが面倒」「プロセス名は分かっているから、その名前で終了したい」という場面もありますよね。

そんなときに便利なのがpkillコマンドです。

pkillコマンドを使うと、PIDを直接指定しなくても、プロセス名や実行ユーザーなどの条件に一致するプロセスへシグナルを送信できます。

ただし、条件に一致した複数のプロセスをまとめて終了する可能性があるため、使い方を間違えると必要なプロセスまで停止してしまいます。

この記事では、Linux初心者向けに、pkillコマンドの基本的な使い方、シグナルの指定方法、pgrep・kill・killallとの違い、安全に使用するための確認手順まで分かりやすく解説します。

pkillコマンドとは

pkillは、指定した条件に一致するプロセスへシグナルを送信するコマンドです。

一般的には、プロセス名を指定してプログラムを終了するときに使います。

pkill nginx

この例では、プロセス名がnginxに一致するプロセスへ、終了を要求するシグナルが送られます。

前回紹介したpgrepが「条件に一致するプロセスを検索するコマンド」なのに対し、pkillは「条件に一致するプロセスへシグナルを送るコマンド」です。

コマンド 役割
pgrep プロセスを検索してPIDを表示する
pkill 一致したプロセスへシグナルを送信する

いきなりpkillを実行するのではなく、まずpgrepで対象を確認してから実行するのが安全です。

pkillコマンドの基本構文

pkill [オプション] [シグナル] パターン

最も基本的な使い方は、終了したいプロセス名を指定する方法です。

pkill nginx

オプションやシグナルを省略した場合、通常はSIGTERMが送信されます。

SIGTERMは、プロセスに対して「可能であれば正常な終了処理を行って停止してください」と要求するシグナルです。

強制終了ではないため、まずはSIGTERMで終了を試すのが基本です。

実行前にpgrepで対象を確認する

pkillは、条件に一致する複数のプロセスへまとめてシグナルを送ることがあります。

そのため、実行前には同じ条件をpgrepへ渡し、対象を確認しましょう。

pgrep -a nginx

実行例

1514 nginx: master process /usr/sbin/nginx
1515 nginx: worker process
1516 nginx: worker process

対象に問題がなければ、pkillを実行します。

pkill nginx

終了後は、もう一度pgrepを実行して確認します。

pgrep -a nginx

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

ただし、systemdなどのサービス管理機能によって自動的に再起動される設定では、停止直後に新しいプロセスが起動する場合があります。

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

次の2つは、基本的に同じ意味です。

pkill nginx
pkill -TERM nginx

シグナル番号を使って指定することもできます。

pkill -15 nginx

SIGTERMのシグナル番号は通常15です。

ただし、数字だけでは意味が分かりにくいため、記事や手順書では-TERMのように名前で指定した方が読みやすくなります。

強制終了する方法

SIGTERMを送ってもプロセスが終了しない場合は、SIGKILLを送信する方法があります。

pkill -KILL nginx

シグナル番号で指定する場合は次のとおりです。

pkill -9 nginx

SIGKILLは、プロセス側で無視したり、終了処理を行ったりできない強制終了シグナルです。

そのため、未保存データが失われたり、一時ファイルが残ったり、データベースの処理が途中で中断されたりする可能性があります。

最初から-9を使うのではなく、まずSIGTERMで正常終了を試し、それでも停止しない場合の最終手段としてSIGKILLを使用してください。

設定を再読み込みさせる方法

一部の常駐プロセスでは、SIGHUPを送ることで設定ファイルの再読み込みを行えます。

pkill -HUP nginx

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

設定を再読み込みするものもあれば、終了するもの、何もしないものもあります。

実行前に、対象ソフトウェアの公式ドキュメントやマニュアルを確認しましょう。

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

システムで利用できるシグナルは、kill -lで確認できます。

kill -l

よく使用されるシグナルは次のとおりです。

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

すべてのプログラムが各シグナルに同じ動作をするわけではありません。

SIGKILLとSIGSTOPを除き、シグナルを受け取ったときの処理はプログラム側で変更されている場合があります。

完全一致したプロセスだけを対象にする

プロセス名を完全一致で指定したい場合は、-xオプションを使用します。

pkill -x nginx

完全一致を指定しておくと、似た名前のプロセスを誤って対象にするリスクを減らせます。

実行前の確認にも同じ条件を使いましょう。

pgrep -a -x nginx
pkill -x nginx

安全性を重視する場合は、プロセス名だけを指定するよりも、-xを付けて完全一致にする方法がおすすめです。

コマンドライン全体を検索対象にする

通常のpkillは、プロセス名を対象に検索します。

実行時の引数を含むコマンドライン全体を対象にしたい場合は、-fオプションを使用します。

pkill -f "python app.py"

PythonやJavaのように、同じ実行ファイルから複数のアプリケーションを起動している場合に便利です。

ただし、-fは検索範囲が広くなるため、意図しないプロセスまで一致する危険があります。

必ず、先にpgrepで検索結果を確認してください。

pgrep -a -f "python app.py"

表示された内容を確認してから、同じ条件でpkillを実行します。

pkill -f "python app.py"

指定したユーザーのプロセスだけ終了する

-uオプションを使うと、実効ユーザーIDを条件にして対象を絞り込めます。

pkill -u user01 nginx

この例では、user01が実行しているnginxプロセスだけが対象になります。

現在のユーザーが実行しているプロセスに限定する場合は、次のように指定できます。

pkill -u "$USER" sample-app

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

親プロセスを指定して子プロセスを終了する

-Pオプションでは、親プロセスのPIDを条件に指定できます。

pkill -P 1234

この例では、PPIDが1234のプロセスへシグナルを送信します。

対象を確認する場合は、pgrepでも同じ条件を指定できます。

pgrep -a -P 1234

特定の親プロセスから起動した子プロセスだけを処理したい場合に便利です。

最新または最も古いプロセスだけを対象にする

同じ名前のプロセスが複数ある場合、最新の1件だけを対象にするには-nを使用します。

pkill -n sample-app

最も古い1件だけを対象にする場合は-oを使用します。

pkill -o sample-app

ただし、起動時刻が極めて近いプロセスでは、期待どおりに判別できない可能性があります。

対象をより確実に限定したい場合は、ユーザーや親プロセス、完全一致などの条件も組み合わせましょう。

killコマンドとの違い

pkillとよく比較されるコマンドにkillがあります。

コマンド 対象
kill PIDを指定してシグナルを送信する
pkill プロセス名や条件を指定してシグナルを送信する

killはPIDが分かっている場合に使用します。

kill 1514

一方、pkillはPIDを調べる必要がありません。

pkill nginx

どちらも同じようにシグナルを送信するコマンドですが、指定方法が異なります。

killallコマンドとの違い

プロセス名で終了するコマンドとして、killallもあります。

コマンド 特徴
pkill プロセス名やユーザーなど複数条件で検索できる
killall 主にプロセス名を指定して終了する

Linuxではどちらも利用できますが、条件を細かく指定できるpkillの方が柔軟に利用できます。

systemctlとの使い分け

Webサーバーやデータベースなど、systemdで管理されているサービスは、pkillよりもsystemctlで操作することが推奨されます。

sudo systemctl stop nginx

サービス管理コマンドを利用すると、依存関係やログの管理も含めて安全に停止できます。

pkillは、systemdで管理されていないプロセスや、一時的に起動したプログラムを終了する場面で利用するとよいでしょう。

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

pgrepで対象を確認し、存在する場合だけpkillを実行する方法です。

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

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

よく利用するオプション一覧

オプション 説明
-TERM SIGTERMを送信する(既定)
-KILL SIGKILLを送信する
-HUP SIGHUPを送信する
-x 完全一致で検索する
-f コマンドライン全体を検索対象にする
-u 指定したユーザーだけを対象にする
-P 親プロセスを指定する
-n 最新のプロセスだけを対象にする
-o 最も古いプロセスだけを対象にする

よくあるエラー

意図しないプロセスまで終了してしまった

プロセス名だけを指定すると、同じ名前を含む複数のプロセスが対象になる場合があります。

実行前にはpgrep -aで対象を確認し、必要に応じて-x-uを利用しましょう。

Permission deniedが表示される

他ユーザーが実行しているプロセスには、権限不足でシグナルを送れない場合があります。

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

sudo pkill nginx

終了しない

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

まずは状態を確認し、それでも終了しない場合のみSIGKILLを検討しましょう。

よくある質問

pkillとkillはどちらを使えばよいですか?

PIDが分かっている場合はkill、プロセス名しか分からない場合はpkillが便利です。

最初から「pkill -9」を使っても大丈夫ですか?

おすすめできません。

まずはSIGTERMで正常終了を試し、それでも終了しない場合だけSIGKILLを利用しましょう。

systemctlで管理されているサービスにもpkillを使えますか?

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

pkillはPIDを指定できますか?

PIDを直接指定する用途にはkillコマンドを使用します。

pkillはプロセス名やユーザーなどの条件で検索してシグナルを送信するコマンドです。

終了前に確認する方法はありますか?

はい。

同じ条件をpgrep -aへ指定すると、対象となるプロセスを事前に確認できます。

まとめ

pkillコマンドは、Linuxでプロセス名や条件を指定してシグナルを送信できる便利なコマンドです。

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

コマンド 用途
pkill nginx SIGTERMで終了する
pkill -KILL nginx 強制終了する
pkill -HUP nginx 設定を再読み込みする
pkill -x nginx 完全一致で終了する
pkill -u user01 nginx 指定ユーザーのみ終了する
pkill -f "python app.py" コマンドライン全体から検索して終了する

pkillは非常に便利なコマンドですが、条件に一致する複数のプロセスへ同時にシグナルを送る可能性があります。

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

コメント

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