宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「プロセスを止めたいのにPIDがわからない」「ps aux | grep | grep -v grep をいつも使っているが、もっとスマートな方法はないか」——Linuxを使い始めたばかりのころ、こういった悩みは誰しも一度は経験するはずです。

そこで役立つのが pgrep コマンドと pkill コマンドです。プロセス名やユーザー名を指定するだけでPIDを調べたり、シグナルを送ったりできるため、現場でも頻繁に使われます。

この記事では、pgrep・pkillコマンドの基本から、killやpsとの使い分け、実務でよく使うオプションとトラブルシュートまでを体系的に解説します。RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTS で動作確認済みです。

この記事のポイント

・pgrep でプロセス名からPIDを素早く取得できる
・pkill でPIDを調べずに名前だけでプロセスを停止できる
・-u オプションでユーザー単位の絞り込みが可能
・誤停止を防ぐため pkill 前に必ず pgrep で対象を確認する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

pgrepとpkillとは何か

pgreppkill は、どちらも 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

実際の出力例(RHEL 9.4):

$ pgrep --version pgrep (procps-ng) 3.3.17

pgrepの基本的な使い方

2. プロセス名でPIDを検索する

pgrep の最もシンプルな使い方です。

# 書式 pgrep [オプション] パターン # 例:sshd のPIDを調べる pgrep sshd

出力例:

$ pgrep sshd 1234 5678

複数のPIDが返ってくる場合は、親プロセス(sshd本体)と子プロセス(各接続ごとの子sshd)が混在していることを意味します。

3. プロセス名も一緒に表示する(-l オプション)

PIDだけでなくプロセス名も表示したい場合は -l を使います。

pgrep -l nginx

出力例:

$ pgrep -l nginx 2345 nginx 2346 nginx 2347 nginx

4. 完全一致で検索する(-x オプション)

デフォルトでは部分一致検索です。たとえば pgrep sshsshd にもマッチします。完全一致で絞り込むには -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

出力例(ワーカー3本 + マスター1本の場合):

$ pgrep -c nginx 4

pkillの基本的な使い方

7. プロセス名でシグナルを送る

pkillpgrep と同じ検索条件を使い、マッチしたプロセスにシグナルを送ります。

# 書式 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

root権限で実行するか、 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サーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Linux無料マニュアルを受け取る >>


プロセス管理の詳細は Linux ポート確認の全コマンドLinux DNS 設定の基本 も参考にしてください。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。