ps・kill入門|動いているプロセスを調べて止める基本

ps・kill入門|動いているプロセスを調べて止める基本

「サーバーが重い」と言われて最初に知りたいのは、いま何が動いているのかという一点です。

その一覧を出すのが ps、動いているものを止めるのが kill になります。

私は駆け出しの頃、kill -9 しか知らずに何でも強制終了していました。

ただこの2つは、使う順番さえ押さえれば事故がぐっと減るのです。

今回は プロセスを「見る」「絞る」「止める」の3ステップ に分けて整理してみます。

いま動いているプロセスを見る

ps はその瞬間のプロセス一覧を切り取って表示するコマンドです。

引数なしだと自分の端末で動いているものしか出ないので、実務ではほぼ ps auxps -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 側の書き方は別記事にまとめてあるので、正規表現が怪しいときはこちらもどうぞ。

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、絞るのが greppgrep、止めるのが killpkill

この対応関係さえ頭に入っていれば、障害対応でいきなり -9 に手が伸びることもなくなります。

以上です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA