そこで役立つのが
pgrep コマンドと pkill コマンドです。プロセス名やユーザー名を指定するだけでPIDを調べたり、シグナルを送ったりできるため、現場でも頻繁に使われます。この記事では、pgrep・pkillコマンドの基本から、killやpsとの使い分け、実務でよく使うオプションとトラブルシュートまでを体系的に解説します。RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTS で動作確認済みです。
この記事のポイント
・pgrep でプロセス名からPIDを素早く取得できる
・pkill でPIDを調べずに名前だけでプロセスを停止できる
・-u オプションでユーザー単位の絞り込みが可能
・誤停止を防ぐため pkill 前に必ず pgrep で対象を確認する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
pgrepとpkillとは何か
pgrep と pkill は、どちらも procps-ng(RHELでは procps-ng、Ubuntuでは procps)パッケージに含まれるコマンドです。・pgrep:プロセス名やユーザー名を条件にPIDを一覧表示する
・pkill:プロセス名やユーザー名を条件に指定したシグナルを送る
従来の手順では
ps aux | grep nginx | grep -v grep のようにパイプを3段重ねてPIDを取り出し、そのPIDを kill に渡していました。pgrepとpkillを使えば、この一連の作業を1コマンドに圧縮できます。1. インストール確認
主要ディストリビューションではデフォルトでインストール済みです。コマンドが見つからない場合は以下でインストールしてください。# RHEL 9 / Rocky Linux / AlmaLinux sudo dnf install -y procps-ng # Ubuntu / Debian sudo apt install -y procps # バージョン確認 pgrep --version pkill --version
$ pgrep --version pgrep (procps-ng) 3.3.17
pgrepの基本的な使い方
2. プロセス名でPIDを検索する
pgrep の最もシンプルな使い方です。# 書式 pgrep [オプション] パターン # 例:sshd のPIDを調べる pgrep sshd
$ pgrep sshd 1234 5678
3. プロセス名も一緒に表示する(-l オプション)
PIDだけでなくプロセス名も表示したい場合は-l を使います。pgrep -l nginx
$ pgrep -l nginx 2345 nginx 2346 nginx 2347 nginx
4. 完全一致で検索する(-x オプション)
デフォルトでは部分一致検索です。たとえばpgrep ssh は sshd にもマッチします。完全一致で絞り込むには -x を使います。# "ssh" と完全一致するプロセスのみ(sshdはヒットしない) pgrep -x ssh # "sshd" と完全一致するプロセスのみ pgrep -x sshd
5. ユーザーを指定して絞り込む(-u オプション)
Webサーバーのワーカープロセスなど、特定ユーザーで実行されているプロセスだけを対象にしたい場面では-u が便利です。# apache ユーザーで動くプロセスを検索 pgrep -u apache httpd # 自分自身(実行ユーザー)のプロセスを検索 pgrep -u $(whoami) python3
6. カウント表示(-c オプション)
プロセスの数だけ知りたいときは-c を使います。監視スクリプトでの生死確認に便利です。# nginx のプロセス数を表示 pgrep -c nginx
$ pgrep -c nginx 4
pkillの基本的な使い方
7. プロセス名でシグナルを送る
pkill は pgrep と同じ検索条件を使い、マッチしたプロセスにシグナルを送ります。# 書式 pkill [オプション] [シグナル] パターン # nginx を正常終了させる(SIGTERM) pkill nginx # nginx を強制終了させる(SIGKILL) pkill -9 nginx # または pkill -KILL nginx
pkillを実行する前に、必ずpgrepで対象プロセスを確認してください。予期しないプロセスが停止する事故を防げます。
# まず対象を確認してから pgrep -l nginx # 問題なければpkillで停止 pkill nginx
8. 特定ユーザーのプロセスのみ停止する
複数ユーザーが同名のプロセスを動かしている環境では、-u で対象を絞り込んで誤停止を防ぎます。# deploy ユーザーの python3 プロセスのみ停止 pkill -u deploy python3
9. シグナルを名前で指定する
シグナル番号よりも名前のほうが意図が明確です。代表的なシグナルを覚えておきましょう。# 設定ファイルを再読み込みさせる(SIGHUP) pkill -HUP httpd # 一時停止させる(SIGSTOP) pkill -STOP myapp # 一時停止から再開させる(SIGCONT) pkill -CONT myapp
応用・実務Tips
10. シェルスクリプトでの生死確認
サービス監視スクリプトでpgrepを活用する定番パターンです。#!/bin/bash SERVICE="nginx" if pgrep -x "$SERVICE" > /dev/null 2>&1; then echo "${SERVICE} は稼働中です" else echo "${SERVICE} は停止しています" # 必要に応じて再起動処理をここに記述 systemctl start "$SERVICE" fi
pgrep は終了ステータスで結果を返します。プロセスが見つかれば0(成功)、見つからなければ1(失敗)なので、if文に直接組み込めます。11. pgrepの結果をkillに渡す
pkillが使えない場面や、細かい制御が必要な場合は、pgrepでPIDを取得してkillに渡す方法も有効です。# pgrepの結果をkillに渡す kill -HUP $(pgrep nginx) # または xargs を使う pgrep nginx | xargs kill -HUP
12. 端末(ターミナル)に紐づいたプロセスを検索する(-t オプション)
特定の端末で動いているプロセスを探すときに使います。誰かが作業中のターミナルセッションを特定する場面で役立ちます。# pts/1 に紐づくプロセスを検索 pgrep -t pts/1
13. 正規表現を使って検索する(-P オプション / 正規表現パターン)
pgrep・pkillのパターンには基本的な正規表現が使えます。また-P で親PIDを指定することも可能です。# "python" か "python3" にマッチ pgrep -l "python3?" # 親PIDが 1234 の子プロセスを検索 pgrep -P 1234
トラブルシュート・エラー対処
14. pgrepで何も返ってこない場合
プロセスが存在するのにpgrepで見つからないことがあります。原因として多いのは以下の2つです。原因1:コマンド名が短縮されている
カーネルは実行コマンドの先頭15文字しかプロセス名として保持しません。長い名前を持つJavaアプリなどは注意が必要です。
# フルコマンドライン(/proc/PID/cmdline)で検索する pgrep -f "長いコマンド名"
-f オプションはプロセス名だけでなく、コマンドライン全体を検索対象にします。原因2:実行ユーザーが違う
ps aux で確認してから、 -u オプションで正しいユーザーを指定してください。15. pkillで意図しないプロセスが停止した場合
部分一致検索のため、思わぬプロセスにシグナルが届くことがあります。対策は2つです。・
-x(完全一致)を使う・pkillの前にpgrepで必ず対象を確認する
# 完全一致で停止("pythonista" などはヒットしない) pkill -x python # まず確認してから実行 pgrep -x python pkill -x python
16. 「Operation not permitted」が出る場合
他のユーザーが所有するプロセスにシグナルを送ろうとすると以下のエラーが出ます。$ pkill httpd pkill: kill error for pid 2345: Operation not permitted
sudo pkill httpd としてください。なお -9(SIGKILL)でもrootでない限り他ユーザーのプロセスは停止できません。本記事のまとめ
pgrep・pkillと関連コマンドの対応をまとめます。| やりたいこと | コマンド |
|---|---|
| プロセス名でPIDを調べる | pgrep プロセス名 |
| プロセス名と一緒にPIDを表示する | pgrep -l プロセス名 |
| 完全一致で絞り込む | pgrep -x プロセス名 |
| ユーザーを指定して検索する | pgrep -u ユーザー名 プロセス名 |
| コマンドライン全体で検索する | pgrep -f キーワード |
| プロセスの数を調べる | pgrep -c プロセス名 |
| プロセスを正常終了させる(SIGTERM) | pkill プロセス名 |
| プロセスを強制終了させる(SIGKILL) | pkill -9 プロセス名 |
| 設定を再読み込みさせる(SIGHUP) | pkill -HUP プロセス名 |
| 特定ユーザーのプロセスのみ停止する | pkill -u ユーザー名 プロセス名 |
pgrep -l で確認してから pkill」の順番を習慣にしてください。特に本番サーバーで -9 を使う場合は、対象プロセスを絶対に確認してから実行することが鉄則です。Linux無料マニュアルを受け取る >>
プロセス管理の詳細は Linux ポート確認の全コマンド や Linux DNS 設定の基本 も参考にしてください。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:プロセスの終了|kill / killall / pkill とシグナルの使い分けで誤爆を防ぐ
- この記事の属するカテゴリ:Linuxtips・プロセス管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます