【Linux】【pgrepコマンド】サーバーエンジニアがよく使用する使い方

最終更新日 2024年12月28日

スポンサーリンク

この記事はこんな人におすすめ!

pgrepコマンドについて知りたい

プロセスIDを調べる方法を教えてほしい

業務でよく使うpgrepコマンドの使い方を知りたい

記事の概要

この記事では、「pgrep」コマンドの使い方について説明します。

pgrepコマンドのオプションや、実際に使用してみたときに発生した疑問についても解説。

また、業務でよく使用するpgrepコマンドの実践的なしよう方法についても解説します。

今回の記事で解説する内容は下記です。

  1. pgrepコマンドの説明
  2. pgrepコマンドの主なオプション
  3. 業務でよく使用するpgrepコマンド使い方
  4. pgrepコマンドを使用時に起こる疑問
スポンサーリンク

pgrepコマンドの説明

pgrepコマンドは、指定したコマンドのプロセスIDを調べるためのコマンドです。
プロセス名や属性を指定してプロセスIDを一覧表示させることが可能です。

ps aux | grep コマンド名 でもプロセス名を調べることもできますが、pgrepコマンドのほうが簡単に調べることができます。

プロセス名:
プロセス名とは、プロセスの実行ファイルのファイル名の部分のことを指しています。
※ファイル名が15文字を超える場合は16文字目以降が切り捨てられます。

プロセス名は「ps -e」コマンドを実行したときの「CMD」の部分です。

↓が「ps -e」コマンドを実行したときの結果です。

[root@centosvm]# ps -e
   PID TTY          TIME CMD
     1 ?        00:00:03 systemd
     2 ?        00:00:00 kthreadd
     4 ?        00:00:00 kworker/0:0H
     5 ?        00:00:00 kworker/u256:0
     6 ?        00:00:00 ksoftirqd/0
     7 ?        00:00:00 migration/0
     8 ?        00:00:00 rcu_bh
     9 ?        00:00:01 rcu_sched
    10 ?        00:00:00 lru-add-drain
    11 ?        00:00:00 watchdog/0
    13 ?        00:00:00 kdevtmpfs
    14 ?        00:00:00 netns
    15 ?        00:00:00 khungtaskd
    16 ?        00:00:00 writeback
    17 ?        00:00:00 kintegrityd
    18 ?        00:00:00 bioset
    19 ?        00:00:00 bioset
スポンサーリンク

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

pgrepコマンドの業務でよく使用するオプションを紹介します。

オプション説明
オプション無し指定したコマンド名に一致するプロセスIDを表示。
-u ユーザー名コマンドで指定したユーザが、実行ユーザのプロセスを表示。
-g グループ名コマンドで指定したグループが、実行グループのプロセスを表示。
-x コマンド名指定したコマンド名に完全一致するプロセスIDを表示。
-lpgrepコマンド実行時の出力結果に、プロセス名も一緒に表示する。
-apgrepコマンド実行時の出力結果にフルコマンドを一緒に表示する。

業務でよく使うpgrepコマンドの使用方法

オプションを指定せず一致するプロセスIDを表示

とりあえず、なんでもいいから指定したプロセスのプロセスIDを素早く確認したいときに使用します。
オプションもなくシンプルなコマンドなので、簡単に使えます。

↓はhttpdに一致するプロセス名のプロセスIDを表示しています。

[root@centosvm]# pgrep httpd
2815
2820
2821
2822
2823
2824
[root@centosvm]#
スポンサーリンク

pgrepコマンド実行時の出力結果にプロセス名も一緒に表示

今度はプロセスIDとプロセス名を一緒に表示させます。
このコマンドは、サーバーのログをとるときに使用します。
プロセスIDとプロセス名を一緒に表示させることが出来ます。

↓はプロセス名としてhttpdを指定して、プロセスIDと一緒にプロセス名を表示させています。

[root@centosvm ]# pgrep -l httpd
2815 httpd
2820 httpd
2821 httpd
2822 httpd
2823 httpd
2824 httpd
[root@centosvm ]# 

pgrepコマンド実行時の出力結果にフルコマンドを一緒に表示

フルコマンドを一緒に表示させるコマンドが一番業務でよく使用される使い方だと思います。

フルコマンドを一緒に表示できるため、このコマンドを覚えておけばpgrepコマンドについては何とかなります。

実際にフルコマンドを一緒に表示させるオプションを使用した例をお見せします。
-a オプションを使用すると、出力結果にフルコマンドを一緒に表示できるので大変便利です。

↓の例は、プロセス名にsystemdを指定して、実行中のプロセスIDと、フルコマンドを一緒に表示しています。

[root@centosvm]# pgrep -a systemd
1 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
375 /usr/lib/systemd/systemd-journald
415 /usr/lib/systemd/systemd-udevd
632 /usr/lib/systemd/systemd-logind
[root@centosvm]# 

pgrepコマンドを使用時によく起こる疑問

試しにpgrepコマンドを使用してみたら、何故か1つのコマンドを指定したのに、複数のプロセスIDが出力された。なんでだろう?とよく疑問になる方がいらっしゃるため、その理由を解説します。

以下は1つのコマンドを指定したのに複数のプロセスIDが出力されるときの例です。

実行するコマンド:pgrep ps

psコマンドのプロセスIDを調べる。

[@localhost ~]$ pgrep ps
45
1080
[@localhost ~]$

すると上記のようにプロセスIDが「45」と「1080」の2つ出力されました。
psコマンドのプロセスIDなので、プロセスIDが1つ出力される想定ですよね。

2つ出力されたので、どうして2つ出力されたのか解説します。

解説

「pgrep ps」コマンドを実施した結果、プロセスIDが2つ表示された理由は、オプション無しで「pgrep」コマンドを実行すると、コマンド名に指定した引数、今回の場合は「ps」が含まれるコマンドのプロセスIDが表示されるからです。

純粋にpsコマンドのみのプロセスIDを調べる場合にはオプションで、「-x」を使用する必要があります。

スポンサーリンク

psコマンドで出力された、「45」「1080」のプロセスIDについて調べる

psコマンドで出力された、「45」「1080」のプロセスIDについてpsコマンドを使用して確認します。

「ps aux」のコマンドを使用すると、実行されている全部のプロセスの詳細を表示させることが出来ます。

そして、「ps aux」のコマンドの実行結果をパイプに渡し、grepでプロセスIDが含まれる行のみ抽出しています。

[@localhost ~]$ ps aux | grep 45
root         45  0.0  0.0      0     0 ?        S<   20:18   0:00 [kpsmoused]
root        451  0.0  0.0      0     0 ?        S<   20:18   0:00 [kworker/u257:0]
root        454  0.0  0.0      0     0 ?        S<   20:18   0:00 [hci0]
root        455  0.0  0.0      0     0 ?        S<   20:18   0:00 [hci0]
root        457  0.0  0.0      0     0 ?        S<   20:18   0:00 [kworker/u257:2]
root        556  0.0  0.0  84556   304 ?        S<sl 20:18   0:00 /sbin/audispd
root        597  0.0  0.1 451408  1316 ?        Ssl  20:18   0:00 /usr/libexec/udisks2/udisksd
root        602  0.0  0.1 396452  1308 ?        Ssl  20:18   0:00 /usr/libexec/accounts-daemon
testtest   1845  0.0  0.0 417828     0 ?        Sl   20:19   0:00 /usr/libexec/gvfsd-fuse /run/user/1000/gvfs -f -o big_writes
testtest   1945  0.0  0.0 346780     0 ?        Sl   20:19   0:00 /usr/libexec/at-spi-bus-launcher
testtest   1982  2.0 13.1 3045744 131424 ?      Sl   20:19   1:20 /usr/bin/gnome-shell
testtest   2010  0.0  0.3 453420  3036 ?        Sl   20:19   0:01 ibus-daemon --xim --panel disable
testtest   2145  0.0  0.1 439508  1140 ?        Sl   20:19   0:00 /usr/libexec/gsd-print-notifications
testtest   2164  0.0  0.0 455288   828 ?        Sl   20:19   0:00 /usr/libexec/gsd-sound
testtest   2178  0.0  0.1 457248  1128 ?        Sl   20:19   0:00 /usr/libexec/gsd-account
testtest   2194  0.0  0.2 714508  2496 ?        Sl   20:19   0:01 /usr/libexec/gsd-color
testtest   4876  0.0  0.0 112828   980 pts/0    R+   21:22   0:00 grep --color=auto 45
[@localhost ~]$ ps aux | grep 1080
root       1080  0.0  0.2 198056  2348 ?        Ss   20:18   0:00 /usr/sbin/cupsd -f
root       3239  0.0  0.0 108052   360 ?        S    20:30   0:00 sleep 60
testtest   3260  0.0  0.0 112824   980 pts/0    R+   20:30   0:00 grep --color=auto 1080

上記から以下のことが分かります。

①プロセスID45はpsコマンドのプロセスIDとして1度割り振られたが、現在別のプロセスとして割り振られている。
※一度プロセスID45は、psコマンドに割り当てられましたが、コマンドの出力が終了した瞬間にプロセスが終了するため、プロセスID45からpsコマンドの割り振りが解除されます。
※「ps aux | grep ps」で確認したところ、psコマンドのプロセスIDは「4890」と表示され、やはり別のプロセスIDが割り振られました。

②プロセスID1080はコマンド「/usr/sbin/cupsd -f」が使用している。
再度「ps aux | grep ps」コマンドで出力を確認しました。

[testtest@localhost ~]$ ps aux | grep ps
root         45  0.0  0.0      0     0 ?        S<   20:18   0:00 [kpsmoused]
root       1080  0.0  0.0 198056   860 ?        Ss   20:18   0:00 /usr/sbin/cupsd -f
testtest   2335  0.0  0.0 632912     0 ?        SNl  20:19   0:00 /usr/libexec/tracker-miner-apps
testtest   4890  0.0  0.1 155448  1868 pts/0    R+   21:23   0:00 ps aux
testtest   4891  0.0  0.0 112828   980 pts/0    R+   21:23   0:00 grep --color=auto ps

上記の結果から、psコマンド(ps aux)の実行時にはプロセスID4890が割り振られていることが上記から分かります。

また、上記で出力後にpsコマンドの実行は終了するので、プロセスID4890はpsコマンドへの割り振りが外されます。


この記事も参考になるかも!
この記事を書いた人!

ゴリタン

インフラエンジニアとして、ネットワークとサーバーの運用・保守・構築・設計に幅広く携わり、
現在は大規模政府公共データの移行プロジェクトを担当。

CCNPやLPICレベル3、AWSセキュリティスペシャリストなどの資格を保有しています。