Linux:用于进程监控的 PS 命令示例
进程是程序的运行实例。Linux 是一种多任务操作系统,这意味着可以同时激活多个进程,使用 ps 命令找出系统上正在运行的进程。
本文解释了 ps 命令及其选项的 7 个实际用法。
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和Commands列出进程(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 一起使用,例如“ps -aux | 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。
对于一个进程派生的所有进程将具有相同的 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 命令的一个参数,它显示进程树的 ASCII 艺术。从这棵树中,我们可以识别出哪个是父进程,哪个是它以递归方式分叉的子进程。
$ 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 命令提供 etime,它提供自进程启动以来经过的时间,格式为 [[dd-]hh:]mm:ss。
以下命令显示进程 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×7 可用的。应用程序不得无限期地继续增加其内存使用量,因为这可能会导致严重的问题。要监控此类内存泄漏,我们可以使用以下命令。
$ 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 也会增加),则可能表明应用程序中存在内存泄漏。
- 点赞
- 收藏
- 关注作者
评论(0)