メインコンテンツへスキップ
中級8分で読める

psコマンドでプロセス管理

Linuxのpsコマンドを使って、実行中のプロセスを確認・監視する方法を実例を交えて詳しく解説します。

システム編psプロセス管理システム管理監視

🎯 この記事で学べること

  • 1
    `ps`コマンドの基本的な使い方をマスターできます
  • 2
    実行中のプロセスの情報(PID、CPU使用率、メモリ使用率)を読み取れるようになります
  • 3
    auxや-efなどの主要なオプションの違いと使い方がわかります
  • 4
    特定のプロセスを効率的に検索する方法を身につけられます
  • 5
    プロセスの状態(STAT)の意味を理解し、問題のあるプロセスを見つけられるようになります

読了時間: 約8

プロセスって何だろう?

こんにちは!今回は、Linuxシステムで動いているプログラムを見る方法について学んでいきましょう。

Windowsのタスクマネージャーを使ったことはありますか?あれと同じように、Linuxでも今どんなプログラムが動いているか確認できるんです。その時に使うのがpsコマンドです!

psは「Process Status(プロセスの状態)」の略で、システム上で実行中のプロセス(動いているプログラムのこと)の情報を表示してくれます。どのプログラムがCPUやメモリをどれくらい使っているか、誰が実行しているかなど、いろいろな情報がわかるんですよ。

基本的な使い方

まずは一番シンプルに

何もオプションを付けずにpsを実行してみましょう:

$ ps
  PID TTY          TIME CMD
12345 pts/0    00:00:00 bash
12789 pts/0    00:00:00 ps

この表示では、現在のターミナルで動いているプロセスだけが表示されます。bashはシェル、psは今実行したコマンド自身ですね!

表示される情報の意味:

  • PID: Process ID(プロセスID)- 各プロセスに付けられる固有の番号
  • TTY: 端末の種類
  • TIME: そのプロセスがCPUを使った累計時間
  • CMD: 実行されたコマンド名

よく使うオプション

システム全体のプロセスを見る(aux)

psの本領発揮は、システム全体のプロセスを見る時です!

$ ps aux

これは最もよく使われる形式で、すべてのプロセスを詳細に表示します:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.4 169936 11200 ?        Ss   08:00   0:02 /sbin/init
root        89  0.0  0.2  65520  5824 ?        S<s  08:00   0:00 /lib/systemd/systemd-journald
www-data  1234  0.5  2.1 345678 54321 ?        S    09:15   0:15 nginx: worker process

各列の意味を見ていきましょう:

  • USER: プロセスを実行しているユーザー
  • PID: プロセスID(この番号でプロセスを特定します)
  • %CPU: CPU使用率(パーセント)
  • %MEM: メモリ使用率(パーセント)
  • VSZ: 仮想メモリサイズ(KB単位)
  • RSS: 実際に使用している物理メモリサイズ(KB単位)
  • TTY: 端末(?は端末なしで動いているプロセス)
  • STAT: プロセスの状態(後で詳しく説明しますね)
  • START: プロセスが開始された時刻
  • TIME: 累計CPU使用時間
  • COMMAND: 実行されたコマンドの詳細

ps auxは「今システムで何が起きているか」を把握する最初の一歩です。トラブルシューティングの時は、まずこのコマンドから始めましょう!

もう一つの形式(-ef)

SystemVスタイルの表記もよく使われます:

$ ps -ef

こちらは親プロセスのID(PPID)も表示されるので、プロセスの親子関係がわかりやすいです:

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 08:00 ?        00:00:02 /sbin/init
root        89     1  0 08:00 ?        00:00:00 /lib/systemd/systemd-journald

プロセスの状態(STAT)を理解しよう

STATフィールドの文字には、それぞれ意味があります:

基本的な状態

  • R: Running(実行中)- 今まさにCPUを使っている
  • S: Sleeping(スリープ中)- 何かを待っている(普通の状態)
  • D: Disk sleep(ディスクスリープ)- ディスクI/O待ち(中断できない)
  • T: Stopped(停止中)- Ctrl+Zなどで一時停止された
  • Z: Zombie(ゾンビ)- 終了したけど親が回収していない(問題かも!)

追加の情報

  • <: 高優先度(nice値が負)
  • N: 低優先度(nice値が正)
  • s: セッションリーダー
  • +: フォアグラウンドプロセスグループ

ゾンビプロセス(Z)が大量にある場合は、プログラムに問題がある可能性があります。親プロセスが子プロセスの終了を適切に処理していないんです。

🎮 理解度チェック

Q1: ps auxで表示される%CPUが50.0のプロセスは、どういう状態ですか?

ps auxで表示される%CPUが50.0のプロセスは、どういう状態ですか?

特定のプロセスを検索する

grepと組み合わせる

システムには大量のプロセスが動いているので、特定のプロセスだけを見たいことがよくあります:

# nginxに関連するプロセスを検索
$ ps aux | grep nginx

# pythonプロセスを検索
$ ps aux | grep python

# 自分のユーザー名のプロセスだけ
$ ps aux | grep "^username"

grepで検索すると、grep自身も結果に含まれてしまいます。これを避けるにはps aux | grep "[n]ginx"のように最初の文字を[]で囲むテクニックがあります!

ユーザーで絞り込む

特定のユーザーのプロセスだけを見たい場合:

# 特定ユーザーのプロセスのみ
$ ps -u username

# 自分のプロセスのみ
$ ps -u \$USER

コマンド名で直接検索

# nginxというコマンド名のプロセスのみ
$ ps -C nginx

# 複数のコマンドを指定
$ ps -C nginx,apache2

プロセスをソートして見る

CPU使用率の高い順に

システムが重い時は、どのプロセスがCPUを使っているか知りたいですよね:

# CPU使用率の高い順トップ10
$ ps aux --sort=-%cpu | head -10

# または
$ ps aux | sort -k3 -nr | head -10

メモリ使用率の高い順に

メモリ不足の時はこちら:

# メモリ使用率の高い順トップ10
$ ps aux --sort=-%mem | head -10

# または
$ ps aux | sort -k4 -nr | head -10

--sortオプションの-は降順(大きい順)を意味します。昇順にしたい場合は-を付けません。

カスタム表示で必要な情報だけ

表示する列を選ぶ

必要な情報だけを選んで表示できます:

# PID、ユーザー、CPU使用率、コマンドのみ
$ ps -eo pid,user,%cpu,comm

# メモリ情報も含めて
$ ps -eo pid,user,%cpu,%mem,vsz,rss,comm

# 実行時間の長いプロセストップ10
$ ps -eo pid,etime,comm --sort=-etime | head -10

🎮 理解度チェック

Q2: プロセスの状態が「Z」と表示されている場合、そのプロセスはどんな状態ですか?

プロセスの状態がZと表示されている場合、そのプロセスはどんな状態ですか?

実践的な使い方

プロセスツリーを見る

プロセスの親子関係を視覚的に見たい時:

# 階層表示
$ ps -ejH

# より見やすいツリー表示(pstreeコマンドがある場合)
$ pstree
$ pstree -p  # PID付き

長時間動いているプロセスを見つける

# 1日以上動いているプロセス
$ ps -eo pid,etime,cmd | grep -E "[0-9]+-"

# 開始時刻付きで表示
$ ps -eo pid,lstart,cmd

問題のあるプロセスを探す

# ゾンビプロセスを探す
$ ps aux | grep " Z "

# CPU使用率が高いプロセス(50%以上)
$ ps aux | awk '\$3 > 50.0'

# メモリを大量に使っているプロセス(10%以上)
$ ps aux | awk '\$4 > 10.0'

プロセス監視スクリプトの例

実務でよく使う監視スクリプトを紹介します:

#!/bin/bash
# CPU使用率の高いプロセスを監視

THRESHOLD=80  # CPU使用率の閾値

echo "CPU使用率が\${THRESHOLD}%を超えるプロセスを監視中..."

while true; do
    ps aux | awk -v threshold=\$THRESHOLD '\$3 > threshold {
        printf "警告: PID %s (%s) がCPUを %.1f%% 使用しています\n", \$2, \$11, \$3
    }'
    sleep 5
done

トラブルシューティング

プロセスが見つからない?

# すべてのプロセスを確実に表示
$ ps -A
$ ps -e
$ ps aux

# 端末に関連付けられていないプロセスも含める
$ ps -ax

より詳細な情報が欲しい

# 特定のPIDの詳細情報
$ ps -p 1234 -f

# 環境変数も含めて表示
$ ps -p 1234 e

# /procから直接情報を取得
$ cat /proc/1234/status

🎮 理解度チェック

Q3: ps aux | grep nginxを実行した時、grep自身も結果に含まれてしまいます。これを避ける方法は?

ps aux | grep nginxでgrep自身を結果から除外する方法は?

よく使うエイリアス

作業効率を上げるために、よく使うコマンドはエイリアスにしておきましょう:

# ~/.bashrcに追加
alias psc='ps aux | grep'
alias psmem='ps aux --sort=-%mem | head'
alias pscpu='ps aux --sort=-%cpu | head'
alias pstree='ps -ejH'

psコマンドの仲間たち

topコマンド(リアルタイム監視)

$ top

psが静的な表示なのに対し、topはリアルタイムで更新されます。

htopコマンド(より使いやすい)

$ htop  # インストールが必要な場合があります

カラフルで操作しやすいインターフェースです。

pidofコマンド(PIDを素早く取得)

$ pidof nginx
1234 5678

プロセス名からPIDを直接取得できます。

📝 まとめ

今回はpsコマンドについて学びました!

  • psはシステムで動いているプロセスを確認するコマンド
  • ps auxで全プロセスの詳細情報を表示(最もよく使う)
  • ps -efでプロセスの親子関係も確認できる
  • プロセスの状態(STAT)でR(実行中)、S(スリープ)、Z(ゾンビ)などがわかる
  • grepと組み合わせて特定のプロセスを検索できる
  • CPU使用率やメモリ使用率でソートして問題のあるプロセスを見つけられる

プロセス管理はシステム管理の基本です。psコマンドを使いこなせるようになると、システムの状態を把握して、問題を素早く発見できるようになりますよ!

次はkillコマンドでプロセスを制御する方法を学びましょう。psで見つけたプロセスを終了させる方法がわかります!

YouTube動画で復習

動画でさらに詳しく学びたい方は、CommandAcademyのYouTubeチャンネルをチェック!視覚的にコマンドの動作を確認できます。

最初はps auxだけ覚えておけば大丈夫です。慣れてきたら、grepとの組み合わせやソート機能を使って、より効率的にプロセスを管理できるようになりましょう!