psでプロセス一覧を確認する
このレッスンで分かること
psは/procを整形して表示する、最も基本のプロセス一覧コマンド- 全プロセスを取るには
ps -ef(System V 風) またはps aux(BSD 風)ps aux --sort=-%mem | headでメモリ食いを上から特定するのが定石
psでプロセス一覧を確認する とは
psコマンドを使って、現在実行中のプロセス一覧を表示し、確認する操作を学びます。本レッスンでは、psでプロセス一覧を確認する の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ重要か
運用や開発の最初の手札になるのが ps です。サーバーにログインしてアプリが応答しない、ポートが既に使われているとエラーが出る、メモリが急に足りなくなった、そんなときにまず叩くのが ps で「いま何が動いているか」を一覧する操作です。ps を読みこなせると、コマンド一発でアプリのプロセスを特定し、PID をもとに kill や strace といった次のアクションへつなげられます。
反対に、いきなり kill -9 から始めて関係ないプロセスを巻き込む、または grep で雑に絞ってしまって複数の候補を見逃すといった事故は、ps の使い方を知らないと起こしがちです。本レッスンでは BSD 風と System V 風という 2 系統のオプションの違いと、現場でよく使う組み合わせを押さえます。
基本構文
ターミナル
ps [オプション]ps には歴史的経緯で 3 種類の書式があります。同じ意味のオプションをハイフン付きで書く System V 風、ハイフンなしで書く BSD 風、--long-option 形式の GNU 風です。混ぜても動きますが、よく使うのは次の組み合わせです。
| コマンド | 何が見えるか |
|---|---|
| ps | 現在のシェルから起動した自分のプロセスだけ |
| ps -ef | 全プロセスを詳細表示 (System V 風) |
| ps aux | 全プロセスを詳細表示 (BSD 風) |
| ps -fp PID | 指定 PID の詳細 |
| ps -o pid,cmd | 表示する列を指定 |
細かい違いはありますが、-ef と aux のどちらかで全プロセスを取れる、と覚えておけば実務では十分です。
動作の図解
ps は /proc 配下のテキスト情報を読んでフォーマットしているだけのコマンドで、何か特別な権限を要求するわけではありません。ただし他ユーザーのプロセスを表示するには、デフォルトのフィルタを -e (everyone) や aux の a で広げる必要があります。
代表例
自分のシェルから生えたプロセスだけ見る
ターミナル
ps
# PID TTY TIME CMD
# 1234 pts/0 00:00:00 bash
# 1300 pts/0 00:00:00 ps何も付けずに叩くと自分のターミナルに紐づくプロセスだけが見えます。bash 自身と、今叩いた ps の 2 つです。
全プロセスをフル情報で
ターミナル
ps -ef | head -5
# UID PID PPID C STIME TTY TIME CMD
# root 1 0 0 09:00 ? 00:00:01 /sbin/init
# root 2 0 0 09:00 ? 00:00:00 [kthreadd]
# www-data 789 1 0 09:01 ? 00:00:00 nginx: master
# www-data 790 789 0 09:01 ? 00:00:00 nginx: worker運用時に最もよく使うのがこの形です。UID, PID, PPID, 開始時刻, CMD を一覧できるので、grep と組み合わせて目的のプロセスを絞り込めます。
特定アプリだけ抽出
ターミナル
ps -ef | grep -E "nginx|node" | grep -v grep
# www-data 789 1 0 09:01 ? 00:00:00 nginx: master
# deploy 2100 1 0 09:05 ? 00:01:23 node /app/server.jsgrep -v grep を最後に付けて、grep 自身を結果から除くのが定番のイディオムです。pgrep node のように直接名前で PID だけ取れる兄弟コマンドもあります。
列を絞って見やすく
-o で表示したい列を選べます。
ターミナル
ps -eo pid,user,%mem,%cpu,cmd --sort=-%mem | head -5
# PID USER %MEM %CPU CMD
# 2100 deploy 8.2 1.5 node /app/server.js
# 789 www-data 1.0 0.1 nginx: master--sort=-%mem でメモリ使用量の降順に並び、メモリ食いを上から特定できます。%cpu に切り替えれば CPU 食いを探せます。
| 用途 | コマンド例 |
|---|---|
| メモリ食い上位 | ps aux --sort=-%mem | head |
| CPU 食い上位 | ps aux --sort=-%cpu | head |
| 特定プロセス | ps -ef | grep nginx | grep -v grep |
| 親子関係 | ps auxf (forest 表示) |
| 列を選択 | ps -eo pid,user,cmd |
ps aux --sort=-%mem | headは、サーバーが重いときの一発診断として覚えておく価値があります。トラブル時の最初のスナップショットとして残しておけば、後から比較も容易です。
旧来の指標と落とし穴
ps で見える %MEM はプロセスの物理メモリ常駐量(RSS)がマシン搭載の物理メモリ(RAM)全体に占める割合の概算で、コンテナや cgroup 制限下ではホスト全体ではなく cgroup 内の値が見たくなる場合があります。コンテナ内ではホストの全プロセスを見られないため、Docker や Kubernetes 環境では kubectl top pod や docker stats も併用します。
古い記事に出てくる
ps -auxfのような書き方は今でも動きますが、推奨はps auxf(ハイフン無し) です。ps -auxのようにハイフンを付けると POSIX 的には-uがユーザー名を引数に取る書式と解釈され、-auxが「ユーザー x のプロセス」を選ぶ意味になりうるため、procps では警告が出ます。forest 表示が欲しいときはハイフン無しのps auxfを使うのが正解です。
演習で確認するポイント
下の演習では sleep をバックグラウンドで起動し、ps で自分のジョブを観測する流れを試します。-ef で sleep 行が出てくることを確認し、抽出パターンをいくつか試してみてください。
ここまでの要点
ps は /proc 整形ツール。全プロセスは ps -ef か ps aux、メモリ食い上位は --sort=-%mem。grep -v grep で grep 自身を除く定番イディオム。コンテナ環境では docker stats 等と併用。
まとめ
psは /proc を整形して表示する一覧コマンドであるps -efまたはps auxで全プロセスを詳細表示できるgrep -v grepと組み合わせて目的のプロセスを絞る-oで表示列を指定、--sortで並べ替えられる- メモリ食いや CPU 食いの上位を出す形を覚えておくと、初動が早い
次のレッスン
次は topでリアルタイム監視する で、psコマンドを使って、現在実行中のプロセス一覧を表示し、確認する操作を学びます を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- ps コマンド の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. ps コマンド とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
課題
- ps コマンドで sleep のプロセスを確認する
- kill で確実に後始末する