LinuxでCPU使用率の高い「more」プロセスを特定する方法
サーバを運用していると、top や ps で見慣れないプロセスが高いCPU使用率を出していることがあります。今回は、CPUを使い続けていた more プロセスを例に、何を実行しているのか、どのユーザ・端末から起動されたのかを調べる手順をまとめます。
この記事では実際のサーバ名、IPアドレス、ユーザ名、ファイルパス、PIDはダミーに置き換えています。
想定する状況
サーバ上でCPU使用率を確認したところ、more というプロセスが高いCPUを使っていました。
PID USER %CPU COMMAND
12345 root 58.4 more .bash_history
more はファイル内容をページ単位で表示するためのページャです。通常は長時間CPUを使い続けるようなプロセスではありません。そのため、端末切断や標準入出力の異常などで取り残されている可能性があります。
まずCPU使用率順にプロセスを確認する
CPUを多く使っているプロセスを確認します。
ps -eo pid,ppid,user,stat,tty,lstart,pcpu,pmem,etime,args --sort=-pcpu | head -40
確認するポイントは次のとおりです。
PID: 問題のプロセスIDPPID: 親プロセスIDUSER: 実行ユーザSTAT: プロセス状態TTY: 紐づいている端末%CPU: CPU使用率ETIME: 起動してからの経過時間ARGS: 実行コマンド
例では、root ユーザで more .bash_history が長時間動いていることが分かります。
moreプロセスだけを詳しく見る
more のプロセスを一覧します。
pgrep -a more
PIDが分かったら、対象プロセスの詳細を確認します。
ps -o pid,ppid,user,stat,tty,lstart,pcpu,pmem,etime,args -p 12345
ここで PPID を確認します。親プロセスをたどることで、どのシェルやログインセッションから実行されたのかを推測できます。
親プロセスをたどる
親プロセスを確認します。
ps -o pid,ppid,user,stat,tty,lstart,pcpu,pmem,etime,args -p 12300
pstree が使える環境なら、プロセスツリーで見ると分かりやすくなります。
pstree -aps 12345
例えば次のように表示される場合があります。
systemd,1
`-sudo,12290 su -
`-su,12300 -
`-bash,12301
`-more,12345 .bash_history
この場合、一般ユーザでログインしたあと、su - で root になり、その root シェル上で more .bash_history を実行した流れだと分かります。
開いているファイルと端末を確認する
対象プロセスが開いているファイルを確認します。
sudo lsof -p 12345
例として、次のような出力が得られることがあります。
COMMAND PID USER FD TYPE NAME
more 12345 root cwd DIR /root
more 12345 root 0u CHR /dev/pts/3 (deleted)
more 12345 root 1u CHR /dev/pts/3 (deleted)
more 12345 root 2u CHR /dev/pts/3 (deleted)
more 12345 root 4r REG /root/.bash_history
ここで重要なのは次の2点です。
/root/.bash_historyを読んでいる- 標準入力・標準出力・標準エラーが
/dev/pts/3 (deleted)になっている
/dev/pts/3 (deleted) は、元の端末がすでに消えていることを示しています。つまり、SSHセッションなどが切断されたあと、more だけが取り残されている状態です。
ログイン元を確認する
端末番号が分かったら、誰のログインセッションだったのかを確認します。
who -a
過去のログイン履歴も確認します。
last -w | egrep "pts/3|example-user|admin-user"
例えば次のように表示されれば、example-user が 203.0.113.10 からログインしていたセッションだと分かります。
example-user pts/3 203.0.113.10 Thu Jun 25 17:20
今回の判断
調査結果をまとめると、次のようになります。
- CPUを使っていたのは
more .bash_history - 実行ユーザは
root - 作業ディレクトリは
/root - 読んでいたファイルは
/root/.bash_history - 親プロセスは root のシェル
- 元の端末は
/dev/pts/3 (deleted)になっており、すでに切断済み
そのため、これはサービスやアプリケーションの異常というより、切断済みの管理用セッションに残ったページャプロセスと判断できます。
止めてもよいか判断する
more は単にファイルを表示しているだけのプロセスです。今回のように切断済み端末にぶら下がっている場合は、停止して問題ないことが多いです。
sudo kill 12345
親のシェルも不要であれば、関連プロセスごと停止します。
sudo kill 12345 12301 12300
ただし、PIDは環境ごとに異なります。実行前に必ず ps や pstree で対象を確認してください。
調査に使ったコマンドまとめ
ps -eo pid,ppid,user,stat,tty,lstart,pcpu,pmem,etime,args --sort=-pcpu | head -40
pgrep -a more
ps -o pid,ppid,user,stat,tty,lstart,pcpu,pmem,etime,args -p 12345
pstree -aps 12345
sudo lsof -p 12345
who -a
last -w | egrep "pts/3|example-user|admin-user"
まとめ
CPU使用率の高い見慣れないプロセスを見つけたときは、プロセス名だけで判断せず、親プロセス、開いているファイル、端末、ログイン履歴を順番に確認すると原因を絞り込めます。
more や less のようなページャが高CPUで残っている場合、切断済み端末に取り残されているだけのケースがあります。lsof で /dev/pts/N (deleted) が見えた場合は、その可能性が高いです。
