psコマンドの概要とよく使うoptionだけでも理解する
今まで適当にps aux
とかしていたので、いい加減真面目にmanページを読んでざっくりと理解したい。
概要的な
ps
コマンドは現在走っているprocessを表示する。ps
は"process status"から。top
がprocessをリアルタイムに更新して表示するのに対して、ps
はスナップショット。ちなみにtop
は"table of processes"から来ているらしい。
optionスタイルの種別
面倒なことだが、ps
コマンドにはoptionのスタイルが複数ある。これは歴史的経緯からくるもので、SUSやPOSIXの標準をサポートするOSと、BSD派生のOSとの実装の違いが原因する。(以下ではmanページに合わせて、ハイフンを"dash"と書く。)
- UNIX options: 前にdashが必要 (
ps -f
) - BSD options: 前にdashが不要 (
ps au
) - GNU long options: 2つのdashが必要 (
ps --tty pts/0,pts/1
)
2つ以上の種別を混ぜて使うことは問題ないが、conflictが発生しうる。例えば
$ ps a -f
は問題なく機能するが、
$ ps au -f
error: conflicting format options
...
はconflictが発生して機能しない。
optionなし
optionなしのpsコマンドは、ユーザーID (effective user ID = EUID) が現ユーザーと同じで、呼び出し元の端末 (tty) に関連付けられる全てのprocessを表示する。このとき、process ID (PID) と起動元端末 (TTY) とCPU時間の累積 (TIME) と実行コマンド (CMD) が表示される。
$ ps
PID TTY TIME CMD
7204 pts/3 00:00:00 bash
7605 pts/3 00:00:00 ps
使用頻度の高そうなoption
UNIX optionsスタイルのoptionで使いそうなものをいくつか。
-e
(-A
)
全てのprocessを表示する。"every"の意味らしい。別のユーザーや別のttyに紐づく (またはttyに紐付かない) processも表示される。
-f
フルフォーマットで表示される。フルフォーマットといっても可能な全カラムを表示するわけではないみたい。個人的には親processのID (PPID) を調べたいときとかに使う。またCというカラムはCPU使用率を示しているので、それを見てみても面白い。
$ ps -f
UID PID PPID C STIME TTY TIME CMD
ohno 7764 6658 0 15:25 pts/3 00:00:00 -bash
ohno 7946 7764 0 15:28 pts/3 00:00:00 ps -f
-F
というoptionはより多くの情報を表示するらしい。(Extra full format)
-j
jobs formatというフォーマットで表示する。このjobs formatがどういったものなのかはわからなかったのだが、実際の出力を見るとPGIDやSIDなども表示されている。
$ ps -j
PID PGID SID TTY TIME CMD
10644 10644 10644 pts/3 00:00:00 bash
10775 10775 10644 pts/3 00:00:00 ps
- Process Group ID = PGID:
process group leaderのPID。PIDとPGIDが同じ場合、そのprocessがprocess group leader。 - Session ID = SID:
session leaderのPID。PIDとSIDが同じ場合、そのprocessがsession leader。
process groupやsessionは共にprocessをある単位でまとめるもの。あるprocess groupに属する全てのprocessは同じsessionに属するが、sessionは1つ以上のprocess groupを持つ。sessionがあって、その中にprocess groupがあるイメージ。session leaderは多くの場合、bashやzshといったshellのprocessになる。上の例ではbash
が実行されているPID=10644がsession leader。
-H
processの階層を表示する。process同士の関係性をツリーで表示するので理解しやすい。
実際に使いそうなコマンド例
ps -efj
全てのprocessがPPIDやSIDなどと共に表示される。出力をgrepとかすると使いやすい。
ps -ejH
全てのprocessの関係性がツリー構造的に把握できて面白い。
$ ps -ejH
PID PGID SID TTY TIME CMD
...
1 1 1 ? 00:00:17 systemd
254 254 254 ? 00:00:02 systemd-journal
263 263 263 ? 00:00:01 systemd-udevd
310 310 310 ? 00:00:00 dbus-daemon
311 311 311 ? 00:00:00 seatd
312 312 312 ? 00:00:00 systemd-logind
314 314 314 ? 00:00:03 NetworkManager
...
66421 66421 66421 ? 00:00:05 tmux: server
66422 66422 66422 pts/1 00:00:00 bash
68521 68521 66422 pts/1 00:00:03 nvim
68523 68523 68523 ? 00:00:06 node
68888 68888 68888 ? 00:00:00 wl-copy
67010 67010 67010 pts/2 00:00:00 bash
68343 68343 67010 pts/2 00:00:00 man
68351 68343 67010 pts/2 00:00:00 less
68749 68749 68749 pts/4 00:00:00 bash
68906 68906 68906 pts/3 00:00:00 bash
68967 68967 68906 pts/3 00:00:00 ps
おわりに
実験環境はLinux。macOSとかだと少し違ったりするかもです。
Discussion