psでプロセス一覧を確認する

このレッスンで分かること

  • ps/proc を整形して表示する、最も基本のプロセス一覧コマンド
  • 全プロセスを取るには ps -ef (System V 風) または ps aux (BSD 風)
  • ps aux --sort=-%mem | head でメモリ食いを上から特定するのが定石

psでプロセス一覧を確認する とは

psコマンドを使って、現在実行中のプロセス一覧を表示し、確認する操作を学びます。本レッスンでは、psでプロセス一覧を確認する の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

運用や開発の最初の手札になるのが ps です。サーバーにログインしてアプリが応答しない、ポートが既に使われているとエラーが出る、メモリが急に足りなくなった、そんなときにまず叩くのが ps で「いま何が動いているか」を一覧する操作です。ps を読みこなせると、コマンド一発でアプリのプロセスを特定し、PID をもとに killstrace といった次のアクションへつなげられます。

反対に、いきなり 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表示する列を指定

細かい違いはありますが、-efaux のどちらかで全プロセスを取れる、と覚えておけば実務では十分です。

動作の図解

diagram (will load when visible)

ps は /proc 配下のテキスト情報を読んでフォーマットしているだけのコマンドで、何か特別な権限を要求するわけではありません。ただし他ユーザーのプロセスを表示するには、デフォルトのフィルタを -e (everyone) や auxa で広げる必要があります。

代表例

自分のシェルから生えたプロセスだけ見る

ターミナル

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.js

grep -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 poddocker stats も併用します。

古い記事に出てくる ps -auxf のような書き方は今でも動きますが、推奨は ps auxf (ハイフン無し) です。ps -aux のようにハイフンを付けると POSIX 的には -u がユーザー名を引数に取る書式と解釈され、-aux が「ユーザー x のプロセス」を選ぶ意味になりうるため、procps では警告が出ます。forest 表示が欲しいときはハイフン無しの ps auxf を使うのが正解です。

演習で確認するポイント

下の演習では sleep をバックグラウンドで起動し、ps で自分のジョブを観測する流れを試します。-efsleep 行が出てくることを確認し、抽出パターンをいくつか試してみてください。

この章のポイント

ここまでの要点 ps/proc 整形ツール。全プロセスは ps -efps aux、メモリ食い上位は --sort=-%memgrep -v grep で grep 自身を除く定番イディオム。コンテナ環境では docker stats 等と併用。

まとめ

  • ps は /proc を整形して表示する一覧コマンドである
  • ps -ef または ps aux で全プロセスを詳細表示できる
  • grep -v grep と組み合わせて目的のプロセスを絞る
  • -o で表示列を指定、--sort で並べ替えられる
  • メモリ食いや CPU 食いの上位を出す形を覚えておくと、初動が早い

次のレッスン

次は topでリアルタイム監視する で、psコマンドを使って、現在実行中のプロセス一覧を表示し、確認する操作を学びます を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. ps コマンド の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. ps コマンド とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

課題

  1. ps コマンドで sleep のプロセスを確認する
  2. kill で確実に後始末する

ヒント

script.sh
script.sh
学習モード
script.sh
ターミナル出力