Linuxプロセス確認ガイド!ps・topコマンドで動いているプログラムを調べる方法
生徒
「Linuxを使っていると、パソコンが重くなった気がするんです。今、裏側で何が動いているか調べる方法はありますか?」
先生
「それは『プロセス』を確認すればわかりますよ。Linuxには実行中のプログラムを一覧表示するコマンドがいくつか用意されています。」
生徒
「プロセス?何だか難しそうな言葉ですね…。初心者でも簡単に確認できるんでしょうか?」
先生
「大丈夫です。Windowsの『タスクマネージャー』のようなものだと思えば怖くありません。基本的なコマンドの使い方を順番に見ていきましょう。」
1. プロセスとは何?初心者向けに解説
Linuxを操作する上で避けて通れないのが「プロセス」という概念です。一言でいうと、プロセスとは「現在実行されているプログラム」のことです。
例えば、あなたがブラウザを開いてこの記事を読んでいるとき、コンピュータの中ではブラウザというプログラムが「プロセス」として動いています。また、音楽を聴いていれば音楽再生ソフトが、文章を打っていればエディタが、それぞれプロセスとして存在しています。私たちが直接目に見えるものだけでなく、Linuxがシステムを維持するために裏側でこっそり動かしている「デーモン」と呼ばれるプロセスもたくさんあります。
パソコンの動作が遅いと感じる時は、特定のプロセスがCPU(コンピュータの頭脳)やメモリ(作業机)を独占してしまっていることが多いのです。そのため、どのプロセスがどれくらい資源を使っているかを確認するスキルは、Linux管理の第一歩となります。
2. 今動いているものを一覧表示する「ps」コマンド
Linuxで現在動いているプロセスを確認する最も基本的なコマンドがps(プロセス・ステータス)です。このコマンドを打ち込むと、その瞬間に動いているプロセスのスナップショット、つまり「写真」を撮るように表示してくれます。
まずは、何もオプションを付けずに実行してみましょう。
ps
PID TTY TIME CMD
1234 pts/0 00:00:00 bash
5678 pts/0 00:00:00 ps
結果に出てきた「PID」はプロセスIDという識別番号で、プロセス一つひとつに割り振られた背番号のようなものです。「TTY」はどの端末で動いているか、「TIME」はどれくらいCPUを使ったか、「CMD」は実行されているコマンド名を表しています。
3. すべてのプロセスを詳しく見る「aux」オプション
先ほどのpsコマンドだけでは、自分が今使っている端末のプロセスしか表示されません。システム全体の様子を知るには、特別なオプションを組み合わせて使うのが一般的です。特によく使われるのがauxという組み合わせです。
ここで使われる「a」は他のユーザーのプロセスも含める、「u」は実行したユーザー名などの詳細を表示する、「x」は画面(端末)に紐付いていないバックグラウンドのプロセスも表示するという意味を持っています。これらを繋げて実行してみましょう。
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 168324 9820 ? Ss Jan01 0:02 /sbin/init
linuxuser 2045 0.5 2.3 892400 45200 ? Sl 10:00 0:15 /usr/bin/python3
linuxuser 3120 0.0 0.1 15664 3280 pts/0 R+ 11:05 0:00 ps aux
非常に多くの情報が出てきましたね。%CPUはCPUの使用率、%MEMはメモリの使用率を表しています。これで「どのプログラムがパソコンを重くしている犯人か」を見つけることができます。
4. リアルタイムで状況が変わる「top」コマンド
psコマンドは実行した瞬間の情報しか分かりませんが、刻一刻と変わる状況を監視したい場合はtopコマンドを使います。これは、数秒おきに情報を自動で更新して表示してくれる便利なツールです。
実行すると、画面全体がプロセスのリストで埋め尽くされます。
top
top - 11:10:05 up 1 day, 2:30, 1 user, load average: 0.05, 0.03, 0.01
Tasks: 120 total, 1 running, 119 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.5 us, 0.5 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3931.1 total, 1250.5 free, 850.2 used, 1830.4 buff/cache
...(中略)...
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2045 linuxuser 20 0 892400 45200 21000 S 0.7 1.1 0:20.45 python3
1022 root 20 0 0 0 0 I 0.3 0.0 0:05.12 kworker/u4:1
この画面では、一番上にシステムの全体像(メモリの空き容量など)が表示され、その下に個別のプロセスが並びます。デフォルトでは「CPUをたくさん使っている順」に並んでいるので、負荷の原因をすぐに見つけることができます。終了したいときは、キーボードの「q」を押してください。これで元の黒い画面(プロンプト)に戻れます。
5. 特定のプロセスだけを探す「grep」との組み合わせ
ps auxを実行すると、何百行ものデータが表示されてしまい、目的のプログラムを探すのが大変です。そんな時は「パイプ(|)」という記号を使って、文字を検索するgrepコマンドと組み合わせるのがLinuxの定番テクニックです。
例えば、「python」に関連するプロセスだけを抜き出したい場合は、以下のように入力します。パイプ記号は「前のコマンドの結果を、後ろのコマンドに渡す」という橋渡しのような役割をします。
ps aux | grep python
linuxuser 2045 0.5 2.3 892400 45200 ? Sl 10:00 0:15 /usr/bin/python3
linuxuser 3155 0.0 0.0 12100 2500 pts/0 S+ 11:15 0:00 grep --color=auto python
このように絞り込むことで、特定のアプリケーションが二重に起動していないか、フリーズしていないかなどをピンポイントでチェックできるようになります。
6. 特権ユーザーでしか見られないプロセスの情報
Linuxには「一般ユーザー」と「ルート(root)ユーザー」という2種類の立場があります。ルートユーザーはコンピュータの全ての権限を持つ「管理者」です。システム全体に関わる重要なプロセスや、他のユーザーが実行している詳細な情報を操作したい場合は、ルート権限が必要になることがあります。
一般ユーザーでは制限がかかるような詳細情報を表示する際、管理者として実行してみましょう。通常はsudoというコマンドを頭に付けて実行します。パスワードを求められたら、自分のパスワードを入力してください。
sudo ps -eF
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 1 0 0 42081 9820 0 Jan01 ? 00:00:02 /sbin/init
root 2 0 0 0 0 1 Jan01 ? 00:00:00 [kthreadd]
-eFオプションを使うと、プロセスの親子の関係(どのプログラムがどのプログラムを起動したか)や、どのCPUコアを使っているかといった、より高度なシステム情報まで丸裸にできます。
7. プロセスの親子関係を視覚的に見る「pstree」
Linuxのプロセスは、実は「親」が「子」を産むように次々と作られていきます。例えば、ターミナル(親)の中でコマンド(子)を実行するという具合です。この繋がりを家系図のようにツリー形式で見せてくれるのがpstreeコマンドです。
文字だけで表現された樹形図が表示されるので、システムの構造が直感的に理解しやすくなります。
pstree
systemd-+-accounts-daemon---3*[{accounts-daemon}]
|-cron
|-dbus-daemon
`-sshd---sshd---bash---pstree
一番左にあるsystemd(またはinit)が、全てのプロセスのご先祖様にあたります。そこから枝分かれして、様々な機能が動いているのが一目瞭然ですね。プログラミングで自動実行の仕組みを作るときなどは、この親子関係を意識することがとても重要になります。
8. ジョブ管理との違いを知っておこう
「プロセス」と似た言葉に「ジョブ」というものがあります。これもプログラムの実行単位ですが、少し視点が違います。プロセスが「OS(システム全体)から見た実行単位」であるのに対し、ジョブは「シェル(操作画面)から見た作業の単位」です。
例えば、大きなファイルをコピーしている間に別の作業をしたいとき、実行中のコマンドを一時停止(Ctrl+Z)してバックグラウンドに回すことがあります。このとき、現在その画面で抱えている作業リストを確認するのがjobsコマンドです。
jobs
[1]+ Stopped vim memo.txt
これは、一つの部屋(端末)の中で、いくつの作業を同時並行で進めているかを管理するようなものです。プロセスは大きな工場の全体管理、ジョブは自分の机の上の整理整頓、というイメージで使い分けると分かりやすいでしょう。初心者の方は、まずは「プロセス」をマスターして、全体の動きを把握できるようになることを目指してください。