psコマンドは、Linux上で走っているプロセスを静的に調べるコマンドです。
システム管理者が、無駄なリソースを食っているプロセスが無いかを監視する時などに使われます。
本検証はkali上で行っています。ディストリビューションが違う場合は、操作や表示が微妙に違うことがあると思われます。
ヘルプ
普通に ” ps –help ” とすると、どの種類のヘルプにするかを聞いてきます。(沢山のオプションがあるせいです)
つまり、 ” ps –help ” の後に、もう1文字(又は文字列)を付け加える必要があります。
詳細なヘルプ
ヘルプの種類は ” s, l, o, t, m, a ” の6つ、最後の ” a ” は全種類を表示します。
以下、 ” s, l, o, t, m ” の5つのヘルプを表示します。(覚えなくていいです)
ps –help s
又は ” ps –help simple ” でも可。
ps –help l
又は ” ps –help list ” でも可。
ps –help o
又は ” ps –help output ” でも可。
ps –help t
又は ” ps –help threads ” でも可。
ps –help m
又は ” ps –help misc ” でも可。
オプションの種類
昔からあるコマンドのせいか、オプションの種類も ” – ” 付きや無しなど色々あります。
” – ” の無しのオプションがBSD形式、有りがUNIX形式です。被っているオプションも多いです。
オプションの形式 | 凡例 | basic | list | output | threads | misc |
BSD形式 | a | a, r, T, x | p, q, t, U | f, j, l, Z, O, o, s, u, v, x | H, m | c, e, K, L, n, S, V, w |
UNIX形式 | -a | -a, -A, d, -e, -N | -C, -g. -G, -p, -q, -s, -t, -u, -U | -D, -F, -f, -H, -j, -l, -M, -O, -o, -p, -y | -L, -m, -T | -c, -y, -V, -w |
GNUロング オプション形式 | –aaa | –deselect | –group, –Group, –pid, –ppid, –quick-pid, –sid, –tty, –user, –User | –forest, –format –context, –headers, –no-headers, –cols, –columns, –width –rows, –lines, –signames | –sort, –cumulative, –version |
psの実行
何もオプションをつけずに実行すると、自分が実行しているプロセスのみを表示します。これは情報が少なく、あまり有用性がありません。
ps aux
良く使われるオプションでしばしば ” ps aux ” とセット扱いされています。
表形式で出力されており、そのヘッダーには以下の意味があります。
表形式で表示されるのは ” aux ” の中の ” u ” オプションのおかげ。残りの ” a + x ” オプションで全プロセスを表示します。
ヘッダー列 | 意味 |
USER | ユーザ名(プロセスの所有者) |
PID | プロセスID(他と重複しない) |
%CPU | CPU使用率 |
%MEM | メモリ使用率 |
VSZ | 仮想メモリ使用量(kB) |
RSS | 物理メモリ使用量(kB) |
TTY | プロセスが関連付けられている端末名 |
STAT | プロセスの状態コード(後述) |
START | プロセス開始時間 |
TIME | プロセスが使用したCPU時間の合計 |
COMMAND | 実行中のコマンド(コマンドライン引数) |
LINUXサーバー管理者に必要な情報が満載ですので、サーバー管理者の方々御用達のオプションです。
実行結果
実は裏では非常に多くのプロセスが動作していることが分かります。
表形式となっている為、メモリやCPUなどのリソースの使用量が一覧で分かります。
STAT列の解釈
STAT列は、状態コード1文字と修飾子の組み合わせで表示されます。
状態コード
状態コード | 説明 | |
R | 実行中(Running) | 又は実行可能状態、CPUで動作中。 |
S | 待機中(Sleeping) | 割込可能 |
D | 割込不可の待機中 | ディスク操作中など |
Z | ゾンビプロセス | 終了したが親プロセスが回収していない |
T | 停止中 | |
I | アイドル中 | |
X | 終了中 |
修飾子
修飾子 | 説明 |
< | 高優先度 |
N | 低優先度 |
L | メモリをロック中(RAM常駐) |
s | 親プロセス(セッションリーダー) |
l | マルチスレッドプロセス(スレッドを持つ) |
+ | フォアグランドプロセスグループに所属 |
修飾子無し |
ps auxf
” ps aux ” の表示に加え、COMMAND列がツリー表示されます。
ps -ef
” ps aux ” と同じく全てのプロセスを表示するオプションですが、 ” ps aux ” に比べてヘッダー列の項目が少な目です。
各ヘッダー列の意味( ” ps aux ” と共通のものは省略しています)
ヘッダー列 | 意味 |
UID | ユーザー名( ” ps aux ” のUSERに相当) |
PPID | 親プロセスのID |
C | CPU使用率 |
STIME | プロセス開始時間( ” ps aux ” のSTARTに相当) |
CMD | コマンド(引数)( ” ps aux ” のCOMMANDに相当) |
pstree
pstreeコマンドはpsコマンドの関連コマンドで、プロセス間の親子関係をツリー表示します
pstree -p
” pstree ” のヘルプ画面
ウイルス・マルウェア発見の手掛かりとしての役割
自分の管理するマシンが挙動不審の疑いがある時、ウイルス・マルウェアの感染が疑われる時にpsコマンドはこれを発見する手掛かりになりえます。
もちろん決め手にまでは至りませんが
兆候
psコマンドでプロセス一覧を調べて、下記の不審点をチェックします。
- 不審なプロセス名
- メモリ・CPUリソースの消費量が大きい
- 親プロセス名が不審
- 不審なコマンド
- 実行ファイルの存在場所が不審
- TTY列が ” ? ”
注意点
psコマンドによる検知の限界として、下記の注意点があります。
- プロセス名・コマンドラインは偽装可能(正常そうな名前でも疑いを否定できない)
- プロセス自体を隠蔽可能(ルートキット使用による)
- 既存プロセスに悪意のコードを注入可能(正常な名前でも疑いを否定できない)
- 正常プロセスをマルウェアと誤認してしまう可能性に注意
精査の手段
下記のツールが精査手段となります。
- TOP、HTOPによるリアルタイムの監視
- lsof: ” lsof -p <PID> ” コマンドで実行ファイルの場所をチェック
- ss, netstatコマンドによりソケットのチェック(外部との不正な通信の監視)
- ルートキットのチェック:chkrootkit, rkhunterなどによる
- アンチウイルスソフトの使用:clamAV(kaliのデフォルトには入っていません)
まとめ
psコマンドは自分のマシン内で(特に見えない裏側で)何が行われているかを知るコマンドです。
また本来の使い方とは言えませんが、ウイルスやマルウェアを発見するきっかけになり得るコマンドです。
コメント