2019-05-28 - Tips, Linux

pgrepでプロセスの詳細情報を見る

プロセス検索方法のTips。

ps -ef | grep xxx

Linuxでプロセス一覧を見るコマンドといえばpsである。特定の名前のプロセスを検索するには、以下のようにps -ef | grep xxxする。

# systemdプロセスを検索する
$ ps -ef | grep systemd
root         1     0  0 May25 ?        00:00:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root      1929     1  0 May25 ?        00:00:02 /usr/lib/systemd/systemd-journald
root      1964     1  0 May25 ?        00:00:00 /usr/lib/systemd/systemd-udevd
dbus      2681     1  0 May25 ?        00:00:02 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root      2696     1  0 May25 ?        00:00:01 /usr/lib/systemd/systemd-logind
ec2-user 30751 30710  0 15:54 pts/0    00:00:00 grep --color=auto systemd

問題は、上記にようにgrepプロセス自体も含まれてしまうことである。

ps -ef | grep [x]xx

grepプロセスを結果から省くには、正規表現を駆使して以下のようにする。

$ ps -ef | grep [s]ystemd
root         1     0  0 May25 ?        00:00:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root      1929     1  0 May25 ?        00:00:02 /usr/lib/systemd/systemd-journald
root      1964     1  0 May25 ?        00:00:00 /usr/lib/systemd/systemd-udevd
dbus      2681     1  0 May25 ?        00:00:02 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root      2696     1  0 May25 ?        00:00:01 /usr/lib/systemd/systemd-logind

これでgrepプロセスが見えなくなる。

pgrep -a xxx

上記の正規表現を使う方法はややトリッキーな感じがする。タイプもしにくい。

より直感的に使えるコマンドがpgrepである。-aオプションで起動時のコマンドラインを全表示できる。

$ pgrep -a systemd
1 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
1929 /usr/lib/systemd/systemd-journald
1964 /usr/lib/systemd/systemd-udevd
2696 /usr/lib/systemd/systemd-logind

しかし、pgrepの問題はps -f相当の詳細表示ができないことだ。例えば、起動ユーザーや起動時刻が分からない。

pgrep xxx | xargs ps -f

こちらが最近よく使っているコマンドである。pgrepでプロセスIDを取得してから、xargs ps -fで詳細表示をする。

$ pgrep systemd | xargs ps -f
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
root         1     0  0 May25 ?        Ss     0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root      1929     1  0 May25 ?        Ss     0:02 /usr/lib/systemd/systemd-journald
root      1964     1  0 May25 ?        Ss     0:00 /usr/lib/systemd/systemd-udevd
root      2696     1  0 May25 ?        Ss     0:01 /usr/lib/systemd/systemd-logind

自然なコマンドラインで、かつ得られる情報も完璧である。ps -ef | grep xxxと異なりpsのヘッダーが出る点も優れる。

参考