ps コマンドのオプションが脳内で迷子になるのでまとめる

システムの監視やデバックで使われる ps コマンドですが、よく使うオプションに UNIX 由来のものと、BSD 由来のものがあります (ダッシュを 2 つつける GNU long options というのもある)。
これが非常にややこしくて忘れやすいので出力例とともにまとめ。

環境: WSL2ubuntu で実行しています。
参考: https://man7.org/linux/man-pages/man1/ps.1.html

オプションなしで ps をそのまま出力

現在のユーザーと同じ有効ユーザーID (euid=EUID) を持ち、そのユーザーに関連付けられているすべてのプロセスを表示する

$ ps
    PID TTY          TIME CMD
    325 pts/0    00:00:00 bash
  25458 pts/0    00:00:00 ps

各セクション詳細

name description
PID プロセス ID
TTY プロセスが接続されている端末
TIME プロセスが CPU を使用した累積時間
CMD 実行されているコマンドやプログラム

UNIX 由来

-f オプション

フルフォーマットのリストを表示する
要するに項目が増える
-e と一緒に使われることが多い

$ ps -f
UID          PID    PPID  C STIME TTY          TIME CMD
conpota      325     324  0 16:23 pts/0    00:00:00 -bash
conpota    25448     325  0 18:00 pts/0    00:00:00 ps -f

各セクション詳細

name description
UID プロセス所有者のユーザ ID
PID プロセス ID
PPID 親プロセスの ID
C プロセスの CPU 使用率
STIME プロセスの開始時刻
TTY プロセスが接続されている端末
TIME プロセスが CPU を使用した累積時間
CMD 実行されているコマンドやプログラム

-e オプション

すべてのプロセスを表示する
-f と一緒に使われることが多い

$ ps -e
    PID TTY          TIME CMD
      1 ?        00:01:09 systemd
      2 ?        00:00:00 init-systemd(Ub
      9 ?        00:00:00 init
     44 ?        00:00:00 systemd-journal
     64 ?        00:00:00 systemd-udevd
...略...

-a オプション

セッションリーダー と端末に関連付けられていないプロセスを除くすべてのプロセスを表示

  • セッションリーダー
    • 通常ログインシェルのこと
    • グループ化されたプロセス
  • セッション
    • ログイン - ログアウト間の期間
    • セッション内のプロセスは全て同じ端末に紐付け
~$ ps -a
    PID TTY          TIME CMD
    388 pts/1    00:00:00 bash
  53198 pts/0    00:00:00 ps

-d オプション

セッションリーダーを除くすべてのプロセスを表示
-a と比較すると init-systemd といったシステム関連のプロセスが表示される (これらは端末に関連付けられていないプロセス)

$ ps -d
    PID TTY          TIME CMD
      2 ?        00:00:00 init-systemd(Ub
      9 ?        00:00:00 init
    284 ?        00:00:08 python3.10
    324 ?        00:00:00 Relay(325)
    383 ?        00:00:00 (sd-pam)
    388 pts/1    00:00:00 bash
    407 ?        00:00:33 python3
  53214 pts/0    00:00:00 ps

BSD 由来

a オプション

ターミナルを持つすべてのプロセスを表示する
TTY に項目が増えていることが確認できる

$ ps a
    PID TTY      STAT   TIME COMMAND
    245 hvc0     Ss+    0:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 vt220
    248 tty1     Ss+    0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
    325 pts/0    Ss     0:00 -bash
    326 pts/1    Ss     0:00 /bin/login -f
    388 pts/1    S+     0:00 -bash
 141921 pts/0    R+     0:00 ps a

各セクション詳細

name description
STAT プロセスの状態 (PROCESS STATE CODES で示される)

u オプション

man を確認するに、「Display user-oriented format」ということで、ユーザーを意識したフォーマットになっている
-f に比べてより細かい

$ ps u
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
conpota      325  0.0  0.0   6176  4972 pts/0    Ss   Apr21   0:00 -bash
conpota      388  0.0  0.0   6124  4808 pts/1    S+   Apr21   0:00 -bash
conpota   143765  0.0  0.0   7484  3196 pts/0    R+   02:18   0:00 ps u

各セクション詳細

name description
USER プロセス実行中のユーザー
%CPU プロセスの CPU 使用率
%MEM プロセスのメモリ使用率
VSZ 仮想メモリサイズ
RSS 物理メモリサイズ
START プロセスの開始時刻
COMMAND 実行されているコマンドやプログラム

x オプション

BSD の「ttyを持たなければならない」という制限を解除して、端末がないプロセスも表示できるようになる

$ ps x
    PID TTY      STAT   TIME COMMAND
    325 pts/0    Ss     0:00 -bash
    382 ?        Ss     0:00 /lib/systemd/systemd --user
    383 ?        S      0:00 (sd-pam)
    388 pts/1    S+     0:00 -bash
 147822 pts/0    R+     0:00 ps x

f オプション

プロセスの階層を表示
ps fbash から呼び出されていることがわかる

ps f
    PID TTY      STAT   TIME COMMAND
    388 pts/1    S+     0:00 -bash
    325 pts/0    Ss     0:00 -bash
 151168 pts/0    R+     0:00  \_ ps f

r オプション

実行中のプロセスのみを表示

$ ps r
    PID TTY      STAT   TIME COMMAND
 153018 pts/0    R+     0:00 ps r

マニュアルを見てみると同じアルファベットでも違う動きをするものが結構多いです。
シェルを極める道は長い。