psでプロセス一覧を確認する
「動いているはず」を、目で確かめる
アプリが応答しない、ポートが既に使われていると言われる、メモリが急に減っている。どれも最初の一手は同じで、今このマシンで何が走っているかを一覧することです。それを出すのが ps です。
ps は特別なことを何もしていません。カーネルが /proc の下に置いている情報を読んで、表の形に整えているだけです。だから特別な権限も要らず、いつでも打てます。
何も付けないと、自分の端末の分しか出ない
ターミナル
$ ps
PID TTY TIME CMD
1234 pts/0 00:00:00 bash
1300 pts/0 00:00:00 ps出てきたのは、今使っているシェルと、たった今打った ps の 2 つだけでした。既定では、自分の端末に紐づくものしか見せません。他の人が動かしているものやサービスまで含めて全部見るには -e を付けます。あわせて -f を付けると、親子関係や起動時刻まで含む詳しい形になります。
ターミナル
$ ps -ef | head -4
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:00 ? 00:00:01 /sbin/init
www-data 789 1 0 09:01 ? 00:00:00 nginx master
www-data 790 789 0 09:01 ? 00:00:00 nginx worker当面は ps -ef の形だけ覚えておけば足ります。PPID の列を見ると、790 番の親が 789 番だと読み取れます。
絞ろうとすると grep 自身が邪魔をする
ターミナル
$ ps -ef | grep nginx | grep -v grep
www-data 789 1 0 09:01 ? 00:00:00 nginx master
www-data 790 789 0 09:01 ? 00:00:00 nginx workergrep nginx が動いている間は、その grep 自体もプロセスとして存在していて、しかもコマンド行に nginx という文字を含んでいます。だから何もしないと、自分自身が結果に混ざります。後ろに grep -v grep をつないで取り除くのが定番の書き方です。
重い順に並べて、犯人を上に持ってくる
ターミナル
$ ps -eo pid,user,%mem,%cpu,cmd --sort=-%mem | head -3
PID USER %MEM %CPU CMD
2100 deploy 8.2 1.5 node /app/server.js
789 www-data 1.0 0.1 nginx master-o で欲しい列だけを選び、--sort で並べ替えられます。頭に - を付けると降順になります。-%mem ならメモリを食っている順、-%cpu なら CPU を食っている順に並ぶので、サーバーが重いときの最初の 1 枚として使えます。
%MEMはマシン全体の物理メモリに対する割合です。コンテナの中で打つと、そのコンテナに割り当てた上限ではなくホスト全体が分母になります。数字が実際より小さく見えるので、上限に張り付いているのに気づけないことがあります。
課題
- ps コマンドで sleep のプロセスを確認する
- kill で確実に後始末する