GNU/Linux >> Linux の 問題 >  >> Linux

UNIX / Linux:プロセス監視のための 7 つの実用的な PS コマンドの例

プロセスは、プログラムの実行中のインスタンスです。 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 トップ コマンドの例

Linux
  1. 初心者向けのLinuxXargsコマンドの8つの実用例

  2. Linuxでのddコマンドの5つの実用例

  3. UNIX / Linux:10 の Netstat コマンドの例

  1. Linuxユーザー向けの12のIPコマンド例

  2. Linuxでのcpコマンド:7つの実用的な例

  3. Linuxシャットダウンコマンド:5つの実用的な例

  1. 初心者向けのLinuxトップコマンドチュートリアル(8例)

  2. 初心者向けのLinuxLSコマンドの16の実用例

  3. Linuxで監視するための30のトップコマンド例