Linux便利コマンド : ps

うめだ
2025-05-09
2025-05-09
目次

はじめに

みなさま、psコマンドは活用されてますでしょうか。

実行されているプロセスを確認するコマンドです。サーバーの運用保守に携わっていると、このコマンドを実行しない日はないと思います。

私がエンジニア一年目の技術研修では、ps -ef で、プロセスを確認すると教えてもらいました。これでも、実行されているプロセスを確認するという意味では充分です。

ただし、これまでの経験から、現在では、ps auxwwf で確認することにしています。

オプションの違いによる、表示される情報の違いを紹介します。

環境

OS : AlmaLinux 8
psバージョン : 3.3.15

使い方

psコマンドは歴史的?な経緯から、オプションの指定方法が3パターン存在します。

UNIXオプション オプションの前にダッシュ[-]を付ける
BSDオプション オプションの前にダッシュ[-]を付けない
GUNオプション 2つのダッシュ[-]で始まる


ということで、私がいつも実行している ps auxwwf はBSDオプションを活用しているってことなんですかね。

各オプションの説明は以下となります。

a ターミナル (tty) を持つすべてのプロセスを示する
u ユーザー指向のフォーマットを表示する
x ターミナル (tty) を持たないプロセスも表示する
w 幅を広く表示する(2回指定することで幅を無限に)
f 階層表示


オプションを指定せずに実行するとこんな感じです。

$ ps
    PID TTY          TIME CMD
3071190 pts/0    00:00:00 bash
3081127 pts/0    00:00:00 ps
$

では、各オプションの表示内容を確認していきましょう。

$ ps a
    PID TTY      STAT   TIME COMMAND
   1443 tty1     Ss+    0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
3071190 pts/0    Ss     0:00 -bash
3081128 pts/0    R+     0:00 ps a
$

a を指定すると、ターミナル(tty)を持つプロセスが表示されます。

$ ps au
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        1443  0.0  0.0   6916   632 tty1     Ss+   2023   0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
hogehoge  3071190  0.0  0.2  16416  5060 pts/0    Ss   10:20   0:00 -bash
hogehoge  3081131  0.0  0.2  47632  3784 pts/0    R+   14:40   0:00 ps au
$

u を指定すると、ユーザー指向のフォーマットになって、CPUやメモリの使用率、プロセスの状態および開始時間などの情報が追加されます。

$ ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.3 238852  5924 ?        Ss    2023 389:22 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
root           2  0.0  0.0      0     0 ?        S     2023   1:04 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<    2023   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<    2023   0:00 [rcu_par_gp]
root           6  0.0  0.0      0     0 ?        I<    2023   0:00 [kworker/0:0H-events_highpri]
root           9  0.0  0.0      0     0 ?        I<    2023   0:00 [mm_percpu_wq]
root          10  0.0  0.0      0     0 ?        S     2023   0:00 [rcu_tasks_rude_]
root          11  0.0  0.0      0     0 ?        S     2023   0:00 [rcu_tasks_trace]
root          12  0.0  0.0      0     0 ?        S     2023  46:56 [ksoftirqd/0]

~ 省略 ~

$

プロセスの状態に関する説明は以下のとおりです。

D 割り込み不可スリープ
I アイドル状態のカーネルスレッド
R 実行中または実行可能(実行キュー上)
S 割り込み可能スリープ(イベントの完了を待機中)
T ジョブ制御信号によって停止
t トレース中にデバッガによって停止
W ページング(2.6.xxカーネル以降では無効)
X デッド(表示されることはないはず)
Z 機能停止「ゾンビ」プロセス


追加情報として下記の値が存在します。

< 高優先度
N 低優先度
L メモリにロックされたページがある
s セッションリーダー
l マルチスレッド・プロセス
+ フォアグラウンド・プロセス


すべての状態を理解しているわけではないですが、各プロセスの状況を確認する上で、有益な情報になると思います。

残りのオプション、w は表示幅を広げるためのオプションで、f は親プロセス、子プロセスを階層で表示させることができます。

$ ps auxwwf
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           2  0.0  0.0      0     0 ?        S     2023   1:04 [kthreadd]
~ 省略 ~

root        1053  0.0  0.1 457120  2824 ?        Ss    2023 140:48 php-fpm: master process (/etc/php-fpm.conf)
apache      1219  0.0  0.0 473320   388 ?        S     2023   0:00  \_ php-fpm: pool apache
apache      1220  0.0  0.0 473320   388 ?        S     2023   0:00  \_ php-fpm: pool apache
apache      1221  0.0  0.0 473320   388 ?        S     2023   0:00  \_ php-fpm: pool apache
apache      1223  0.0  0.0 473320   388 ?        S     2023   0:00  \_ php-fpm: pool apache
apache      1225  0.0  0.0 473320   388 ?        S     2023   0:00  \_ php-fpm: pool apache

~ 省略 ~
$

実行されているコマンドの値の文字数が多いと途中できれることがありますので、wを2回指定することで、全ての内容を表示させることができます。(具体的な表示例を提示できず申し訳ありません。)

まとめ

いかがでしたか?

サーバーのレスポンスが悪いといった場合は、以前紹介したtopコマンドを利用するケースが多いかもしれません。でも、

高負荷の要因となっているプロセスが特定できた後、該当プロセスの親プロセスを特定するために、psコマンドが重宝しています。

今回紹介したのはほんの一部ですので、詳細についてはmanコマンドで確認いただき、さまざまなオプションを活用いただければと思います。