コース一覧
Linux運用・管理
psでプロセス一覧を確認する

Linux運用・管理

ユーザー権限、パーミッション、プロセス、ジョブ制御を学び、Linux上の実行中サービスと作業権限を安全に管理できるようにします。

1
パーミッションと権限管理
01. ユーザーとグループの概念5分
02. パーミッションの読み方5分
03. 権限の変更 chmod5分
04. 所有者の変更 chown5分
05. sudo - スーパーユーザーの力5分
06. 実行権限とスクリプト5分
07. パーミッションチェック5分
2
プロセス管理とジョブ制御
01. プロセスとは何か5分
02. psでプロセス一覧を確認する5分
03. topでリアルタイム監視する5分
04. プロセスの終了 kill5分
05. フォアグラウンドとバックグラウンド5分
06. nohupでログアウト後も実行する5分
07. プロセス管理チェック5分

psでプロセス一覧を確認する

「動いているはず」を、目で確かめる

アプリが応答しない、ポートが既に使われていると言われる、メモリが急に減っている。どれも最初の一手は同じで、今このマシンで何が走っているかを一覧することです。それを出すのが ps です。

ps は特別なことを何もしていません。カーネルが /proc の下に置いている情報を読んで、表の形に整えているだけです。だから特別な権限も要らず、いつでも打てます。

何も付けないと、自分の端末の分しか出ない

ターミナル

$ ps
  PID TTY          TIME CMD
 1234 pts/0    00:00:00 bash
 1300 pts/0    00:00:00 ps

出てきたのは、今使っているシェルと、たった今打った ps の 2 つだけでした。既定では、自分の端末に紐づくものしか見せません。他の人が動かしているものやサービスまで含めて全部見るには -e を付けます。あわせて -f を付けると、親子関係や起動時刻まで含む詳しい形になります。

ターミナル

$ ps -ef | head -4
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 09:00 ?        00:00:01 /sbin/init
www-data   789     1  0 09:01 ?        00:00:00 nginx master
www-data   790   789  0 09:01 ?        00:00:00 nginx worker

当面は ps -ef の形だけ覚えておけば足ります。PPID の列を見ると、790 番の親が 789 番だと読み取れます。

絞ろうとすると grep 自身が邪魔をする

ターミナル

$ ps -ef | grep nginx | grep -v grep
www-data   789     1  0 09:01 ?        00:00:00 nginx master
www-data   790   789  0 09:01 ?        00:00:00 nginx worker

grep nginx が動いている間は、その grep 自体もプロセスとして存在していて、しかもコマンド行に nginx という文字を含んでいます。だから何もしないと、自分自身が結果に混ざります。後ろに grep -v grep をつないで取り除くのが定番の書き方です。

重い順に並べて、犯人を上に持ってくる

ターミナル

$ ps -eo pid,user,%mem,%cpu,cmd --sort=-%mem | head -3
  PID USER     %MEM %CPU CMD
 2100 deploy    8.2  1.5 node /app/server.js
  789 www-data  1.0  0.1 nginx master

-o で欲しい列だけを選び、--sort で並べ替えられます。頭に - を付けると降順になります。-%mem ならメモリを食っている順、-%cpu なら CPU を食っている順に並ぶので、サーバーが重いときの最初の 1 枚として使えます。

解説

%MEM はマシン全体の物理メモリに対する割合です。コンテナの中で打つと、そのコンテナに割り当てた上限ではなくホスト全体が分母になります。数字が実際より小さく見えるので、上限に張り付いているのに気づけないことがあります。

課題

  1. ps コマンドで sleep のプロセスを確認する
  2. kill で確実に後始末する

ヒント

バックグラウンド起動は コマンド & で行う

$! は直前のバックグラウンドプロセスの PID

ps -ef の8列目以降がコマンド名

script.sh
script.sh
エディタを読み込んでいます
ターミナル出力