「サーバーが重い」と言われて最初に知りたいのは、いま何が動いているのかという一点です。
その一覧を出すのが ps、動いているものを止めるのが kill になります。
私は駆け出しの頃、kill -9 しか知らずに何でも強制終了していました。
ただこの2つは、使う順番さえ押さえれば事故がぐっと減るのです。
今回は プロセスを「見る」「絞る」「止める」の3ステップ に分けて整理してみます。
いま動いているプロセスを見る
ps はその瞬間のプロセス一覧を切り取って表示するコマンドです。
引数なしだと自分の端末で動いているものしか出ないので、実務ではほぼ ps aux か ps -ef を打つことになります。
# 全プロセスをユーザー名つきで表示(BSD形式)
ps aux
# 同じくらいよく使う(System V形式)
ps -ef
# CPU使用率が高い順に上位10件だけ
ps aux --sort=-%cpu | head -n 10
aux の a は他ユーザーの分も、u はユーザー名つきの詳しい表示、x は端末を持たないプロセスも含める指定になります。
全部・詳しく・端末なしも、と覚えておけば十分でしょう。
目的のプロセスだけ絞り込む
一覧を目で追うのは現実的ではないため、実際には絞り込みとセットで使います。
# 名前で探す(grep 自身がヒットしないよう1文字を括る小技)
ps aux | grep [n]ginx
# pgrep なら PID だけが返ってくる
pgrep -f "python app.py"
# -a を足すとコマンドラインも一緒に確認できる
pgrep -af "python app.py"
grep 側の書き方は別記事にまとめてあるので、正規表現が怪しいときはこちらもどうぞ。
プロセスを止める
kill は名前に反して、プロセスへシグナルを送るためのコマンドです。
番号を省略したときに送られるのは SIGTERM(15番) で、これは後片付けの機会を与えたうえでの終了要求になります。
# 既定は SIGTERM(15)
kill 12345
# 終わらないときだけ SIGKILL(9)
kill -9 12345
# 名前で止める
pkill -f "python app.py"
名前で止められる pkill は便利な反面、条件に一致した全プロセスへ飛んでいきます。
先に pgrep で同じ条件を打ち、対象を目視してから実行するのが安全でしょう。
いきなり -9 を使わない理由
SIGKILL は プロセス側で捕捉できないシグナルで、後片付けをする間もなく落とされます。
man ページにも、まず TERM を送り、それでも終わらないときに KILL を検討する、という趣旨がはっきり書かれています(kill(1) – Linux manual page)。
強制終了で残るのは、書きかけのファイル、掴まれたままのロック、消えない PID ファイルといった中途半端な状態です。
結果として次の起動時に整合性チェックが走り、かえって復旧に時間を取られることもあります。
シグナルの番号と既定動作を一覧で確認したい場合は signal(7) が早いです。
最後に
見るのが ps、絞るのが grep と pgrep、止めるのが kill と pkill。
この対応関係さえ頭に入っていれば、障害対応でいきなり -9 に手が伸びることもなくなります。
以上です。










コメントを残す