よくわからないエンジニア

よく分からないエンジニアの日々の記録

よくわからないエンジニア

Linuxのリソース関連(ps)

4月に予定していた、基本情報が受けれなくなった。わっはっは。秋に再チャレンジします。そしてちょっとスケジュールに余裕が出来たので、LPIC level2を少し余裕を持ってチャレンジする事にします。
それはさておき、今日のリソース関連はpsコマンドです。

UnixオプションとBSDオプション

こちらも仕事上でよく使いますね。ただ使う場合は特に何も意識せず"ps -ef"と実行していましたが、人によっては"ps aux"を使う人もいるみたいですね。これらの違いって何なんでしょうかと、今更疑問に思いました。とりあえずマニュアルを読んでみると、これらの違いはUnixオプションかBSDオプションかの違いとありますが、イマイチよく分かりません。まずはこれらのオプションで表示される内容の違いについて確認していきます。
とりあえずなんのオプションも無しで実行する。

# ps
  PID TTY          TIME CMD
 3881 pts/0    00:00:00 ps
10902 pts/0    00:00:00 su
10903 pts/0    00:00:00 bash

psコマンドのオプションなしは、"ユーザーが自分自身" かつ"入出力端末をもっている(TTYがある)"条件を満たしたプロセスのみ表示されます。

Unixオプション

まずはUnixオプションから。オプションの前に"-"が付くやつです。"ps -ef"がこれにあたります。

-fオプション

出力フォーマットを変えるのが"-e"オプション。実行してみると。。

# ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
root      3961 10903  0 16:17 pts/0    00:00:00 ps -f
root     10902  2024  0  2016 pts/0    00:00:00 su -
root     10903 10902  0  2016 pts/0    00:00:00 -bash

表示されるプロセスは同じだが、出力されるカラムが増えている。PIDの他にPPIDが増えているが、こいつは親プロセスのPIDらしい。ちなみに遡っていくと、bashとかinitが親として現れます。対象のプロセスを呼び出している元と考えれば良いのだろうか。

-eオプション

で今度は全てのプロセスを表示する-eオプションを実行してみる。

  PID TTY          TIME CMD
    1 ?        00:00:01 init
    2 ?        00:00:00 kthreadd
    3 ?        00:00:01 migration/0
    4 ?        00:00:01 ksoftirqd/0
    5 ?        00:00:00 stopper/0
    6 ?        00:00:03 watchdog/0
    7 ?        00:00:02 migration/1
    8 ?        00:00:00 stopper/1
<以下略>

ずらっといっぱい表示されます。これに-fオプションを組み合わせれば、普段使っている"ps -ef"になります。

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0  2016 ?        00:00:01 /sbin/init
root         2     0  0  2016 ?        00:00:00 [kthreadd]
root         3     2  0  2016 ?        00:00:01 [migration/0]
root         4     2  0  2016 ?        00:00:01 [ksoftirqd/0]
root         5     2  0  2016 ?        00:00:00 [stopper/0]
root         6     2  0  2016 ?        00:00:03 [watchdog/0]
root         7     2  0  2016 ?        00:00:02 [migration/1]
root         8     2  0  2016 ?        00:00:00 [stopper/1]
<以下略>

PIDの順番で-fオプションの出力カラムが出てきます。やっと"-ef"指定が理解出来ました。涙が出てきます。普段これぐらいしか使っていませんが、他にも何かオプションあるので試してみました。

-aオプションと-dオプション

まず-aオプションはセッションリーダーと端末を持たないプロセスを"除く"プロセスを表示します。

# ps -a
  PID TTY          TIME CMD
 4228 pts/1    00:00:00 su
 4229 pts/1    00:00:00 bash
 4830 pts/1    00:00:00 ps
10902 pts/0    00:00:00 su
10903 pts/0    00:00:00 bash

-dの場合はセッションリーダーのみを除きます。

  PID TTY          TIME CMD
    2 ?        00:00:00 kthreadd
    3 ?        00:00:01 migration/0
    4 ?        00:00:01 ksoftirqd/0
    5 ?        00:00:00 stopper/0
    6 ?        00:00:03 watchdog/0
    7 ?        00:00:02 migration/1
    8 ?        00:00:00 stopper/1
    9 ?        00:00:01 ksoftirqd/1
<以下省略>

PID1のinitが省略されているのがわかります。
他にも-l,-u [username]のオプションがあるようですが、とりあえず説明は割愛。使ってみて下さい。

BSDオプション

次はBSDオプションから。オプションの前に"-"が付かないやつです。"ps aux"がこれにあたります。

aオプション

まずはaオプションから調べていきます。

# ps a
  PID TTY      STAT   TIME COMMAND
 1993 tty2     Ss+    0:00 /sbin/mingetty /dev/tty2
 1996 tty3     Ss+    0:00 /sbin/mingetty /dev/tty3
 1998 tty4     Ss+    0:00 /sbin/mingetty /dev/tty4
 2000 tty5     Ss+    0:00 /sbin/mingetty /dev/tty5
 2024 pts/0    Ss     0:00 -bash
 4195 pts/1    Ss     0:00 -bash
 4228 pts/1    S      0:00 su -
 4229 pts/1    S      0:00 -bash
 4707 pts/2    Ss     0:00 -bash
 5730 tty1     Ss+    0:00 -bash
 5749 tty6     Ss+    0:00 -bash
 5810 pts/2    S+     0:00 top
 5838 pts/1    R+     0:00 ps a
10902 pts/0    S      0:00 su -
10903 pts/0    S+     0:00 -bash

aオプションは自分以外も表示するようになります。このユーザーはpts/1ですが、pts/0,2やttyも表示されるようになりました。

xオプション

次はxオプションを調べます。

#ps x
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:01 /sbin/init
    2 ?        S      0:00 [kthreadd]
    3 ?        S      0:01 [migration/0]
    4 ?        S      0:01 [ksoftirqd/0]
    5 ?        S      0:00 [stopper/0]
    6 ?        S      0:03 [watchdog/0]
    7 ?        S      0:02 [migration/1]
    8 ?        S      0:00 [stopper/1]
    9 ?        S      0:01 [ksoftirqd/1]
   10 ?        S      0:02 [watchdog/1]
<以下略>

xオプションは端末が無いものも表示するようになります。なので表示されているのはセッションリーダーを含めて自分の全てのプロセスとなります。これにaオプションを組み合わせることで、他ユーザーも含めた全てのプロセスを表示するとなるわけですね。"-p"と同じと考えて良いんでしょう。多分。

uオプション

そしてauxの最後uオプションを実行します。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1993  0.0  0.0   4064   268 tty2     Ss+   2016   0:00 /sbin/mingetty /dev/tty2
root      1996  0.0  0.0   4064   264 tty3     Ss+   2016   0:00 /sbin/mingetty /dev/tty3
root      1998  0.0  0.0   4064   268 tty4     Ss+   2016   0:00 /sbin/mingetty /dev/tty4
root      2000  0.0  0.0   4064   260 tty5     Ss+   2016   0:00 /sbin/mingetty /dev/tty5
root      4228  0.0  0.1  69168  2624 pts/1    S    16:36   0:00 su -
root      4229  0.0  0.0  11692  1836 pts/1    S    16:36   0:00 -bash
root      5730  0.0  0.0  11560  1800 tty1     Ss+  18:46   0:00 -bash
root      5749  0.0  0.0  11560  1800 tty6     Ss+  18:47   0:00 -bash
root      5917  0.0  0.0   8616   792 pts/0    S+   18:56   0:00 less
root      5994  0.0  0.0  13372  1036 pts/1    R+   19:01   0:00 ps u
root      5995  0.0  0.0   8616   780 pts/1    S+   19:01   0:00 less
root     10902  0.0  0.0  69168  1560 pts/0    S     2016   0:00 su -
root     10903  0.0  0.1  11772  2052 pts/0    S     2016   0:00 -bash

これで見てみると、フォーマットを指定する"-f"オプションと項目が微妙に違いますね。あちらにあってこちらに無いものもあるので、必要によって用途を変えるんでしょうかね。BSDフォーマット見やすいですが、割りと親プロセス確認する事があるので、基本はUnixオプション使いそうな気がします。

とりあえず今回はこんな感じで。。尚、今回調べていく過程で、セッションやプロセスについての理解が曖昧すぎる事を痛感した為、こちらも後日まとめてみようと思います。