常用ps命令

列出 BSD 系统上的所有进程

ps-A
-A 命令行选项与同时使用 -a 和 -x 选项等效,其中 -a 显示拥有控制终端的进程,-x 显示没有控制终端的进程。
在 SVR4 变种中,显示所有正在运行的进程(不论它是否拥有控制终端)的命令行选项是 -e 。从所显示的进程来看,它和 BSD 的 -A 选项是等价的。可以在清单 4 中看到输出的示例。

ps 工具包含许多标准的显示列集。例如在 SVR4 中,经常使用 ps -ef 来获取关于列出进程的更详细的信息,包括父进程 ID、处理器利用率、开始时间以及更详细的命令行

这些选项存在的问题是,尽管它们显示了更多的信息,但这些信息并不总是特别有用,或者在寻找某个特定进程时包含了不希望看到的扰乱显示的信息。

幸运的是,所有版本的 ps 还包括了指定要显示的列的功能。可以广泛地使用这种命令,不管是仅提取所需要的信息,还是在异类环境中使用它来创造标准化的跨不同 UNIX 环境的输出。

要使用这一特性,可使用 -o 命令行选项,并列出要显示的列,以逗号做列的分隔符。尽管可选择的列的范围有一些差别,但在不同的 UNIX 版本中,大部分列都是标准的。例如,所有变种中都有 pid、ppid(父进程 ID)、command、RSS(驻留集大小或内存使用情况)以及 priority。

使用时,可以用 -o 来选择列及其显示顺序。例如,要获取 pid、ppid 和 commond,在 BSD 中可以使用 -opid,ppid,command,如清单 7 所示,或者在 SVR4 中使用 -opid,ppid,comm,如清单 8 所示。

清单 7. 在 BSD 中选择特定的列

1
2
3
4
$ ps -o pid,ppid,command
PID PPID COMMAND
391 332 /bin/bash
9165 391 emacs

清单 8. 在 SVR4 中选择特定的列

1
2
3
4
$ ps -opid,ppid,comm
PID PPID COMMAND
555 552 -sh
622 555 ps

列出特定进程

ps -ef | grep + 进程名称关键字

根据用户列出进程

ps -U root

根据关键字关闭进程

ps -e -opid,command |grep httpd|awk ‘{print $1}’|xargs kill -9

或者用脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sh

HOSTTYPE=`uname -s`

SIGNAL=$1
STRING=$2

if [ -z "$1" -o -z "$2" ]
then
echo Usage: $0 signal string
exit 1
fi

case $HOSTTYPE in
Darwin|BSD)
ps -a -opid,command | grep $STRING | awk '{ print $1; }' | xargs kill $SIGNAL
;;
Linux|Solaris|AIX|HP-UX)
ps -e -opid,command | grep $STRING | awk '{ print $1; }' | xargs kill $SIGNAL
;;
esac

计算内存使用情况

ps 工具还提供了我们目前尚未涉及的两个列。RSS 列提供了进程的“驻留集大小”,这是该进程所使用的物理内存量,也是进程占用多少实际内存的指示。VSZ 列详细列出进程正在使用的内存总量,包括所分配的内部存储,但通常已被交换到磁盘。对于大多数 ps 变体而言,这两个列都是比较常用的。

确定这两个数据能够更好地了解内存的使用情况。如果将 ps 与 grep 组合起来选择特定的进程,并使用 awk 来计算总量,就可以获取单个应用程序或者某个应用程序及其子进程正占用多少物理内存和虚拟内存。

例如,要确定 bash 进程所使用的物理内存和虚拟内存,可以使用清单 14 中的命令。

清单 14. 使用 ps 和 awk 计算内存使用情况

1
2
3
$ ps -A -o rss,vsz,command|grep bash | \
awk '{rss += $1; vsz += $2 } END { print "Real: ",rss, "Virtual: ",vsz }'
Real: 4004 Virtual: 305624

这在诊断内存和交换区使用情况的问题时特别有用。