読者です 読者をやめる 読者になる 読者になる

双六工場日誌

平凡な日常を淡々と綴ります。

ps のオプションについてのメモ書き

psで使うオプションについてつらつら調べたので、メモ。

psのオプションには、UNIXオプション(ハイフンで始まるもの)とBSDオプション(ハイフンを付けないもの)の2つの流派があり、それに加えてGNU psではハイフン2つで始まるロングオプションが使える。

このバージョンの ps が受け付けるオプションにはいくつかの種類がある。
1 UNIX オプション。まとめることが可能で、前にはダッシュを置かなければならない。
2 BSD オプション。まとめることが可能で、ダッシュを使ってはならない。
3 GNU ロングオプション。前に二つのダッシュを置く。
man ps より

おそらく一番メジャーなのは、「ps -ef」(UNIXオプション)と「ps aux」(BSDオプション)

それぞれの出力例は以下の通り。

$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Mar26 ?        00:00:03 /sbin/init
root         2     0  0 Mar26 ?        00:00:00 [kthreadd]
(略)
$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  19396  1416 ?        Ss   Mar26   0:03 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Mar26   0:00 [kthreadd]
(略)

この2つを比べると、後者のほうが情報量が多いが、一方、前者は後者にはない親プロセスID(PPID)が含まれる。プロセスの親子関係をおいたい時もよくあるので、後者だけでも若干不足。

と、ここまでTwitterで呟いたところ、後者の場合、親子関係を追うには「f」オプションをつければよいとのアドバイス。コマンドのヘルプによると、

f ASCII art forest

とのことで、試しにやってみると、

$ ps auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         2  0.0  0.0      0     0 ?        S    Mar26   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Mar26   0:00  \_[migration/0]
root         4  0.0  0.0      0     0 ?        S    Mar26   0:00  \_ [ksoftirqd/0]

というように、COMMANDのところがASCII artでツリー表示された。これで親子関係も見られるので、直接端末を叩いて見るにはこれがよさそう。

調べてみると、ほかにオプションがあって、例えば「ps auxfe」と「e」をさらに加えると、コマンドに渡されている環境変数がCOMMAND欄に追加される。出力が長くなるけど、環境変数関連での動作不具合の可能性をみたい場合は使えそう。

$ ps auxfe
(略)
root      2061  0.0  0.3  90160  3348 ?        Ss   09:37   0:00  \_ sshd: sechiro [priv]
sechiro   2063  0.0  0.1  90160  1764 ?        S    09:37   0:00      \_ sshd: sechiro@pts/0
sechiro   2064  0.0  0.1  66072  1556 pts/0    Ss   09:37   0:00          \_ -bash USER=sechiro LOGNAME=sechiro HOME=/home/sechiro PATH=/usr/local/bin:/bin:/usr/bin MAIL=/var/mail/sechiro SHELL=/bin/bash SSH_CLIENT=XXXXXXXXXXX 53267 22 SSH_CONNECTION=XXXXXXXXXXX 53267 XXXXXXXXXXX 22 SSH_TTY=/dev/pts/0 TERM=xterm DISPLAY=localhost:10.0

ただ「f」オプションは、プロセスだけではなくスレッドごとにも情報を表示させる表示する「m」オプションとは両立しないようなので、スレッドごとにも情報表示させるときにはやはりPPIDを出す必要がありそう。その場合は個別にオプションを指定する。ps auxmに加えて、PPIDを出よくさせる場合のオプションは以下。

$ ps axmo user,pid,ppid,%cpu,%mem,vsz,rss,tname,stat,start_time,bsdtime,args
USER       PID  PPID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1     0  0.0  0.0  10368   636 ?        -    Mar04   0:00 init [3]
root         -     -  0.0    -      -     - -        Ss   Mar04   0:00 -
root         2     1  0.0  0.0      0     0 ?        -    Mar04   0:00 [migration/0]
(略)

さらに「k」か「--sort」に加えてソートしたいフィールドを指定すると、ソートもできるので、psの結果をログに取っておいてあとで解析するときなどは、上記に加えてソート指定しておくと便利かも。

ちなみに、上で指定しているオプションのうち、似たようなオプションがあるものがある。たとえば、start_time, timeとbsdstart, bsdtimeは同じ情報を出すが表示方法が異なっている。manによると以下のとおり。

bsdstart START コマンドが起動した時刻。プロセスが 24 時間以内に起動されていた場合、出力フォーマットは " HH:MM" であり、 24 時間以前の場合は "mmm dd" である。 (ここで mmm は月の名前の 3 文字である)。
bsdtime TIME ユーザーとシステムの cpu 時間の合計。表示フォーマットは通常は "MMM:SS" であるが、プロセスが cpu 時間を 999 分より多く使っている場合は、右側へシフトする。
start_time START プロセスの起動時刻または起動日。 ps が起動されたのと同じ年にプロセスが起動されていない場合は、年のみが表示される。同じ日に起動されていない場合は "mmmdd" である。それ以外は "HH:MM" である。
time TIME 累積した CPU 時間。"[dd-]hh:mm:ss" フォーマットで表示される。 (別名 cputime)。

psとか毎日使っているものほど、なかなかまとまって調べ物する機会がないので、メモまで。

追記:プロセスが起動した時刻を調べたいときのオプション

もとの記事を書いたのは、かなり前ですが、自分がよく忘れるオプションを一点だけ追記。

ここで紹介したものだけだと、プロセスが起動した日までしかわからないので、プロセスが起動した日時まで時刻を見たいときには「-o lstart」が便利です。このオプションだと、プロセスの起動時刻が「曜日 月 日 時:分:秒」で出力されます。使い方はこんな感じです。

$ ps -eo pid,lstart,args | head -n 3
  PID                  STARTED COMMAND
    1 Fri Jan 30 11:34:03 2015 /sbin/init
    2 Fri Jan 30 11:34:03 2015 [kthreadd]

このオプションのmanの記述は以下の通り。説明がそっけなさすぎですが、調査対象のプロセスがいつ起動したのかが一発でわかるので、オプションとしては便利です。

lstart STARTED time the command started. See also bsdstart, start, start_time, and stime.