プロセスは、プログラムの実行中のインスタンスです。 Linux はマルチタスク オペレーティング システムです。つまり、一度に複数のプロセスをアクティブにすることができます。 ps コマンドを使用して、システムで実行中のプロセスを確認してください。
この記事では、ps コマンドとそのオプションの 7 つの実用的な使用法について説明します。
プロセスを監視および制御するために、Linux には ps、kill、killall、nice、renice、top コマンドなどの多くのコマンドが用意されています。
1.現在実行中のプロセスの一覧表示 (ps -ef、ps -aux)
現在マシンで実行されているすべてのプロセスを一覧表示する ps コマンドでよく使用される例です。次の例は、すべてのプロセスを取得するための ps コマンドのオプションを示しています。
$ ps -ef root 26551 5 0 Feb10 ? 00:03:41 [pdflush] root 26570 5 0 Feb10 ? 00:00:20 [pdflush] root 30344 3382 0 Feb21 ? 00:00:11 sshd: root@pts/14 root 30365 30344 0 Feb21 pts/14 00:00:02 -bash root 30393 3382 0 Feb21 ? 00:00:10 sshd: root@pts/15
場所:
- -e ですべてのプロセスを表示します。
- 完全な形式のリストを表示するには -f
BSD マシンの場合、「ps -aux」を使用すると、上記のすべてのプロセスに関する詳細が表示されます。
$ ps -aux
2. UID とコマンド (ps -u、ps -C) に基づいてプロセスを一覧表示します
-u オプションを使用して、特定のユーザー名に属するプロセスを表示します。ユーザー名が複数ある場合は、カンマで区切ります。以下の例は、ユーザー wwwrun または postfix が所有するすべてのプロセスを表示します。
$ ps -f -u wwwrun,postfix UID PID PPID C STIME TTY TIME CMD postfix 7457 7435 0 Mar09 ? 00:00:00 qmgr -l -t fifo -u wwwrun 7495 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7496 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7497 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7498 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7499 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 10078 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 10082 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf postfix 15677 7435 0 22:23 ? 00:00:00 pickup -l -t fifo -u
多くの場合、ps は grep と一緒に使用されます。 grep コマンド」を使用して、指定されたコマンドでプロセスのリストを取得します。
ただし、 ps コマンド自体には、同じことを実現するオプションがあります。次の例は、コマンド実行で tatad.pl を持つすべてのプロセスを示しています。
$ ps -f -C tatad.pl UID PID PPID C STIME TTY TIME CMD root 9576 1 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9577 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9579 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9580 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9581 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9582 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 12133 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
注: ps コマンドのエイリアスを作成して、コマンド、ユーザー、またはグループに基づいてプロセスを一覧表示できます。
3. PID または PPID に基づいてプロセスを一覧表示します (ps -p、ps –ppid)
各プロセスには、一意のプロセス ID (PID) が割り当てられます。
一部のアプリケーションを起動すると、いくつかのプロセスがフォークされる場合があり、各サブプロセスには独自の PID があります。したがって、各プロセスには独自のプロセス ID と親プロセス ID があります。
プロセスが fork するすべてのプロセスに対して、同じ PPID (親プロセス識別子) が割り当てられます。次のメソッドは、特定の PPID を持つプロセスのリストを取得するために使用されます。
$ ps -f --ppid 9576 UID PID PPID C STIME TTY TIME CMD root 9577 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9579 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9580 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9581 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9582 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 12133 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
次の例は、PID を指定したプロセスを一覧表示するものです。
$ ps -f -p 25009,7258,2426 UID PID PPID C STIME TTY TIME CMD root 2426 4 0 Mar09 ? 00:00:00 [reiserfs/0] root 7258 1 0 Mar09 ? 00:00:00 /usr/sbin/nscd postfix 25009 7435 0 00:02 ? 00:00:00 pickup -l -t fifo -u
4.階層内のプロセスを一覧表示する (ps –forest)
以下の例では、プロセス ID とコマンドを階層で表示しています。 –forest は、プロセス ツリーのアスキー アートを表示する ps コマンドの引数です。このツリーから、再帰的に分岐した親プロセスと子プロセスを特定できます。
$ ps -e -o pid,args --forest 468 \_ sshd: root@pts/7 514 | \_ -bash 17484 \_ sshd: root@pts/11 17513 | \_ -bash 24004 | \_ vi ./790310__11117/journal 15513 \_ sshd: root@pts/1 15522 | \_ -bash 4280 \_ sshd: root@pts/5 4302 | \_ -bash
注: tree および pstree コマンドを使用して、プロセスを適切なツリー構造で表示することもできます。
5.プロセスの経過時間の一覧表示 (ps -o pid,etime=)
現在実行中のプロセスの経過時間を取得したい場合は、ps コマンドを使用すると、プロセスが開始されてからの経過時間を [[dd-]hh:]mm:ss の形式で提供する etime が提供されます。
以下のコマンドは、プロセス ID 1 (init) とプロセス ID 29675 の経過時間を表示します。
たとえば、出力の「10-22:13:29」は、プロセス init が 10 日 22 時間 13 分 29 秒間実行されていることを表します。 init プロセスはシステムの起動時に開始されるため、この時間は「uptime」コマンドの出力と同じになります。
# ps -p 1,29675 -o pid,etime= PID 1 10-22:13:29 29675 1-02:58:46
6.特定のプロセスのすべてのスレッドを一覧表示する (ps -L)
プロセスのスレッドのリストを取得できます。プロセスがハングした場合、以下に示すように、特定のプロセスで実行されているスレッドのリストを特定する必要がある場合があります。
$ ps -C java -L -o pid,tid,pcpu,state,nlwp,args PID TID %CPU S NLWP COMMAND 16992 16992 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16993 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16994 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16995 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16996 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16997 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16998 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16999 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17000 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17001 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17002 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17003 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17024 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 15753 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 15754 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
-L オプションは、指定されたコマンドを持つプロセスのスレッドのリストを表示するために使用されます。また、軽量プロセスの数を表す nlwp も表示されます。上記の例では、合計 15 個の Java スレッドが実行されています。
7.メモリ リークの検出 (ps –sort pmem)
技術的には、メモリ リークとは、アプリケーションによるメモリの使用量が増え続けることです。
一般的なデスクトップ アプリケーションでは、アプリケーションを閉じるとプロセスが使用していたメモリが解放されるため、これに気付かないことがあります。
ただし、クライアント/サーバー モデルでは、アプリケーションが 24 時間 365 日利用できることが期待されるため、メモリ リークは深刻な問題です。重大な問題が発生する可能性があるため、アプリケーションのメモリ使用量を無期限に増やし続けてはなりません。このようなメモリ リークを監視するには、次のコマンドを使用できます。
$ ps aux --sort pmem USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 1520 508 ? S 2005 1:27 init inst 1309 0.0 0.4 344308 33048 ? S 2005 1:55 agnt (idle) inst 2919 0.0 0.4 345580 37368 ? S 2005 20:02 agnt (idle) inst 24594 0.0 0.4 345068 36960 ? S 2005 15:45 agnt (idle) root 27645 0.0 14.4 1231288 1183976 ? S 2005 3:01 /TaskServer/bin/./wrapper-linux-x86-32
上記の ps コマンドで、–sort オプションを指定すると、最も高い %MEM が一番下に出力されます。最高の %MEM 使用率の PID を書き留めておいてください。次に、ps コマンドを使用して、このプロセス ID に関するすべての詳細を表示し、時間の経過に伴う変化を監視します。手動で ir を繰り返すか、cron としてファイルに配置する必要がありました。
$ ps ev --pid=27645 PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 27645 ? S 3:01 0 25 1231262 1183976 14.4 /TaskServer/bin/./wrapper-linux-x86-32 $ ps ev --pid=27645 PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 27645 ? S 3:01 0 25 1231262 1183976 14.4 /TaskServer/bin/./wrapper-linux-x86-32
注: 上記の出力で、RSS (KB 単位の常駐セット サイズ) が時間とともに増加する場合 (%MEM も同様)、アプリケーションでメモリ リークが発生している可能性があります。
Linux パフォーマンスの監視とチューニング シリーズの以前の記事:
- UNIX / Linux のパフォーマンス監視に役立つ Sar (Sysstat) の 10 の例
- Linux パフォーマンスの監視とチューニングの概要
- 15 の実用的な Linux トップ コマンドの例