「サーバーが重いので、CPUやメモリを食い潰している原因のプログラムを特定したい」
Linuxサーバーを運用していると、システム内で現在どんなプログラム(プロセス)が動いているのかを確認する場面に必ず直面します。
この記事では、現在実行中のプロセスを表示する
ps コマンド の使い方を解説します。現場のエンジニアが必ず使う2つの定番オプション(
aux と -ef)の違いから、grep コマンドと組み合わせて特定のプロセスだけを抽出する実務テクニックまで、トラブル対応で絶対に役立つノウハウをまとめました。1. 現場で使うpsコマンドの「2大巨頭」
ps コマンドには非常に多くのオプションがありますが、実務で使うのは実質的に以下の2パターンだけです。この2つさえ覚えておけば現場で困ることはありません。パターンA: ps aux (BSD系オプション)
Linux界隈で最もポピュラーな組み合わせです。システム上で動いている「すべてのユーザー」の「すべてのプロセス」を、CPUやメモリの使用率も含めて詳細に表示します。(※ハイフンは付けません)# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 123456 4567 ? Ss 10:00 0:05 /usr/lib/systemd/systemd apache 12345 0.1 1.5 543210 34567 ? S 10:15 0:01 /usr/sbin/httpd -DFOREGROUND
kill コマンドを使う時に必要)・%CPU / %MEM: CPUとメモリの使用率
・COMMAND: 実行されているコマンド名
パターンB: ps -ef (System V系オプション)
もう一つの定番が-ef です。こちらもすべてのプロセスを表示しますが、親プロセス(PPID)の情報が表示されるため、プロセスの親子関係を調べたい時によく使われます。# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 10:00 ? 00:00:05 /usr/lib/systemd/systemd apache 12345 12344 0 10:15 ? 00:00:01 /usr/sbin/httpd -DFOREGROUND
【結論】どちらを使うべきか?
CPUやメモリの使用率も見たいならps aux を、プロセスの親子関係(誰がどのプログラムを起動したか)を追いたいなら ps -ef を使うのが現場のセオリーです。2. grepと組み合わせて特定のプロセスを探す(必須テクニック)
ps aux をそのまま実行すると、何百行ものプロセスが画面を埋め尽くしてしまい、目当てのプログラムを見つけることができません。パイプ(
|)を使って grep コマンドに渡し、特定のプロセスだけを抽出するのが実務での基本動作です。Webサーバー(nginx)が動いているか確認する
# ps aux | grep nginx root 1234 0.0 0.0 56789 1234 ? Ss 10:00 0:00 nginx: master process nginx 1235 0.0 0.1 56800 2345 ? S 10:00 0:00 nginx: worker process root 9999 0.0 0.0 112233 999 pts/0 S+ 11:00 0:00 grep --color=auto nginx
【小技】grep自身のプロセスを除外する(grep -v grep)
上記の実行結果を見ると、一番下にgrep nginx という検索コマンド自体のプロセスも混ざって表示されてしまいます。これを消して純粋な目的のプロセスだけを表示するには、さらにパイプを繋いで
grep -v grep(grepという文字列を除外する)を追加します。# ps aux | grep nginx | grep -v grep root 1234 0.0 0.0 56789 1234 ? Ss 10:00 0:00 nginx: master process nginx 1235 0.0 0.1 56800 2345 ? S 10:00 0:00 nginx: worker process
PIDだけをすばやく取得する(pgrep)
「プロセスが動いているかだけ確認したい」「PIDだけ取り出してkill に渡したい」という場合は、pgrep(プロセスグレップ)コマンドが便利です。ps aux | grep xxx | grep -v grep という長いパイプを1コマンドで代替できます。# nginx のPIDだけを表示する # pgrep nginx 1234 1235 # PIDを使ってプロセスを停止する場合 # kill 1234
3. CPUやメモリを大量に消費しているプロセスを特定する
「サーバーが重い!」というアラートが鳴った時、どのプロセスが悪さをしているのかを一瞬で見つけ出すオプションです。メモリ使用量(%MEM)が多い順に並び替える
--sort オプションを使います。マイナス記号(-)をつけると大きい順(降順)になります。# ps aux --sort -%mem
head コマンドを繋ぎます。# ps aux --sort -%mem | head -n 5
CPU使用率(%CPU)が多い順に並び替える
# ps aux --sort -%cpu | head -n 5
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| すべてのプロセスを詳細に表示(リソース確認) | ps aux |
| すべてのプロセスを詳細に表示(親子関係確認) | ps -ef |
| 特定のプロセス(例: nginx)が動いているか探す | ps aux | grep nginx |
| grep自身を除外してプロセスを表示する | ps aux | grep nginx | grep -v grep |
| プロセスのPIDだけをすばやく取得する | pgrep nginx |
| メモリ使用量が多い順に並び替える | ps aux --sort -%mem | head -n 5 |
| CPU使用率が高い順に並び替える | ps aux --sort -%cpu | head -n 5 |
重いプロセスを放置して、サーバーをダウンさせていませんか?
Linuxのプロセス管理やリソース監視の基本を知らないまま運用していると、異常なプログラムの暴走に気づけず、突然のシステムダウンという大惨事を招きます。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
<<関連記事>>
・pstree
・chsh
・finger
・du
・uname
