🌭

psコマンドの概要とよく使うoptionだけでも理解する

2022/09/05に公開約3,600字

今まで適当に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

ログインするとコメントできます