最終更新日 2024年12月28日
スポンサーリンクこの記事はこんな人におすすめ!
pgrepコマンドについて知りたい
プロセスIDを調べる方法を教えてほしい
業務でよく使うpgrepコマンドの使い方を知りたい
記事の概要
この記事では、「pgrep」コマンドの使い方について説明します。
pgrepコマンドのオプションや、実際に使用してみたときに発生した疑問についても解説。
また、業務でよく使用するpgrepコマンドの実践的なしよう方法についても解説します。
今回の記事で解説する内容は下記です。
- pgrepコマンドの説明
- pgrepコマンドの主なオプション
- 業務でよく使用するpgrepコマンド使い方
- 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を表示。 |
-l | pgrepコマンド実行時の出力結果に、プロセス名も一緒に表示する。 |
-a | pgrepコマンド実行時の出力結果にフルコマンドを一緒に表示する。 |
業務でよく使うpgrepコマンドの使用方法
オプションを指定せず一致するプロセスIDを表示
とりあえず、なんでもいいから指定したプロセスのプロセスIDを素早く確認したいときに使用します。
オプションもなくシンプルなコマンドなので、簡単に使えます。
pgrep プロセス名
↓はhttpdに一致するプロセス名のプロセスIDを表示しています。
[root@centosvm]# pgrep httpd
2815
2820
2821
2822
2823
2824
[root@centosvm]#
スポンサーリンク
pgrepコマンド実行時の出力結果にプロセス名も一緒に表示
今度はプロセスIDとプロセス名を一緒に表示させます。
このコマンドは、サーバーのログをとるときに使用します。
プロセスIDとプロセス名を一緒に表示させることが出来ます。
pgrep -l プロセス名
↓はプロセス名としてhttpdを指定して、プロセスIDと一緒にプロセス名を表示させています。
[root@centosvm ]# pgrep -l httpd
2815 httpd
2820 httpd
2821 httpd
2822 httpd
2823 httpd
2824 httpd
[root@centosvm ]#
pgrepコマンド実行時の出力結果にフルコマンドを一緒に表示
フルコマンドを一緒に表示させるコマンドが一番業務でよく使用される使い方だと思います。
フルコマンドを一緒に表示できるため、このコマンドを覚えておけばpgrepコマンドについては何とかなります。
実際にフルコマンドを一緒に表示させるオプションを使用した例をお見せします。
-a オプションを使用すると、出力結果にフルコマンドを一緒に表示できるので大変便利です。
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セキュリティスペシャリストなどの資格を保有しています。