Linuxではプログラムが動作する単位を「プロセス」と呼びます。 サーバーの応答が遅い、ディスクI/Oが高い、特定のアプリが固まった——そういった場面でプロセスを素早く調べて対処できると、トラブル対応の幅が大きく広がります。
動いているプロセスを確認する(ps)
ps コマンドはその瞬間のプロセス一覧を表示します。
ps aux
よく使うオプションの意味:
| オプション | 説明 |
|---|---|
a | 自分以外のユーザーのプロセスも表示 |
u | CPU・メモリ使用率などを表示 |
x | 端末に紐付いていないプロセスも表示 |
特定のプロセスを絞り込むには grep と組み合わせます。
# nginx が動いているか確認
ps aux | grep nginx | grep -v grep
grep -v grep は grep コマンド自身が検索結果に混入しないようにするテクニックです。
リアルタイムで監視する(top / htop)
top はプロセスの状態をリアルタイムで更新しながら表示します。
top
起動中の主なキー操作:
| キー | 動作 |
|---|---|
q | 終了 |
P | CPU使用率順に並べ替え |
M | メモリ使用率順に並べ替え |
k | プロセスにシグナルを送る(PIDを入力) |
htop が入っている場合はこちらのほうがカラフルで操作しやすいです。
htop
プロセスIDを調べる(pgrep)
pgrep はプロセス名からPIDだけを返してくれるコマンドです。
# sshd のPIDを調べる
pgrep sshd
プロセス名と一緒に表示したいときは -l オプションを付けます。
pgrep -l sshd
プロセスを終了させる(kill / killall)
kill コマンドはPIDを指定してシグナルを送ります。
# 通常の終了(SIGTERM)
kill 1234
# 強制終了(SIGKILL)
kill -9 1234
SIGTERM(デフォルト)はプロセスに「終了してください」とお願いする形なので、プロセスが後処理をして終了できます。
SIGKILL(-9)はOSが問答無用で強制終了させるため、後処理が実行されません。まずはSIGTERMを試して、それでも終了しない場合にのみSIGKILLを使いましょう。
プロセス名で指定したい場合は killall が便利です。
killall firefox
バックグラウンド・フォアグラウンドの切り替え
コマンドの末尾に & を付けると、バックグラウンドで実行できます。
# バックグラウンドで実行
sleep 60 &
バックグラウンドのジョブ一覧は jobs で確認できます。
jobs
# [1]+ Running sleep 60 &
fg でフォアグラウンドに戻したり、実行中のコマンドを Ctrl+Z で一時停止してから bg でバックグラウンドに送ることもできます。
# フォアグラウンドで実行中のコマンドを一時停止
Ctrl+Z
# バックグラウンドで再開
bg
# フォアグラウンドに戻す
fg
プロセスツリーを見る(pstree)
プロセスの親子関係を木構造で表示するには pstree を使います。
pstree -p
-p を付けるとPIDも一緒に表示されます。特定のプロセスだけに絞ることも可能です。
pstree -p $(pgrep sshd | head -1)
練習問題
問題1
現在動いているすべてのプロセスをCPU使用率の高い順に表示するコマンドを書いてください。
問題2
プロセス名 python3 を持つプロセスのPIDをコマンド一つで調べてください。
問題3
PIDが 4567 のプロセスを、まず穏やかに終了させ、それでも終了しない場合に強制終了させるコマンドを順番に書いてください。
問題4
find / -name "*.log" というコマンドをバックグラウンドで実行し、ジョブ番号を確認してからフォアグラウンドに戻すまでの一連のコマンドを書いてください。
答え
問題1の答え
ps aux --sort=-%cpu
または top を起動して P キーを押しても同じ結果が得られます。
問題2の答え
pgrep python3
問題3の答え
# 穏やかに終了(SIGTERM)
kill 4567
# 終了しない場合は強制終了(SIGKILL)
kill -9 4567
問題4の答え
# バックグラウンドで実行
find / -name "*.log" &
# ジョブ一覧を確認
jobs
# フォアグラウンドに戻す(ジョブ番号が1の場合)
fg 1