システムの監視やデバックで使われる ps コマンドですが、よく使うオプションに UNIX 由来のものと、BSD 由来のものがあります (ダッシュを 2 つつける GNU long options というのもある)。
これが非常にややこしくて忘れやすいので出力例とともにまとめ。
環境: WSL2 の ubuntu で実行しています。
参考: 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 f
が bash
から呼び出されていることがわかる
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
マニュアルを見てみると同じアルファベットでも違う動きをするものが結構多いです。
シェルを極める道は長い。