ps

当程序运行在系统上时,我们称之为进程(process)。想监测这些进程,需要熟悉ps命令的用法。

默认情况下,ps命令并不会提供那么多的信息

默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户的进程。

基本输出显示了程序的进程ID(Process ID,PID)、它们运行在哪个终端(TTY) 以及进程已用的CPU时间。

Linux系统中使用的GNU ps命令支持3种不同类型的命令行参数:

  1. Unix风格的参数,前面加单破折线;
  2. BSD风格的参数,前面不加破折线;
  3. GNU风格的长参数,前面加双破折线。

Unix风格的参数

上面给出的参数已经很多了,不过还有很多。使用ps命令的关键不在于记住所有可用的参数, 而在于记住最有用的那些参数。大多数Linux系统管理员都有自己的一组参数,他们会牢牢记住 这些用来提取有用的进程信息的参数。举个例子,如果你想查看系统上运行的所有进程,可用-ef 参数组合.

-f参数扩展了输出,这些扩展的列包含了有用的信息。

如果想要获得更多的信息,可采用-l参数,它会产生一个长格式输出.

BSD风格的参数

在使用BSD参数时,ps命令会自动改变输出以模仿BSD格式。下例是使用l参数的输出:

$ ps l
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 0 500 3081 3080 20 0 4692 1432 wait Ss pts/0 0:00 -bash
0 50051043081 20 04468 844- R+ pts/0 0:00psl
$

注意,其中大部分的输出列跟使用Unix风格参数时的输出是一样的,只有一小部分不同。

VSZ:进程在内存中的大小,以千字节(KB)为单位
RSS:进程在未换出时占用的物理内存。
STAT:代表当前进程状态的双字符状态码。

许多系统管理员都喜欢BSD风格的l参数。它能输出更详细的进程状态码(STAT列)。双字符状态码能比Unix风格输出的单字符状态码更清楚地表示进程的当前状态。

第一个字符采用了和Unix风格S列相同的值,表明进程是在休眠、运行还是等待。第二个参 数进一步说明进程的状态。

GNU长参数

可以将GNU长参数和Unix或BSD风格的参数混用来定制输出。GNU长参数中一个着实让人 喜爱的功能就是–forest参数。它会显示进程的层级信息,并用ASCII字符绘出可爱的图表。这种格式让跟踪子进程和父进程变得十分容易。

-o参数

根据真实用户或ID以及有效用户或ID过滤ps输出

进程线程的相关信息

指定输出宽度以及所要显示的列

显示进程的环境变量

top

ps命令虽然在收集运行在系统上的进程信息时非常有用,但也有不足之处:它只能显示 某个特定时间点的信息。如果想观察那些频繁换进换出的内存的进程趋势,用ps命令就不方 便了。

而top命令刚好适用这种情况。top命令跟ps命令相似,能够显示进程信息,但它是实时显示的。

输出的第一部分显示的是系统的概况:第一行显示了当前时间、系统的运行时间、登录的用 户数以及系统的平均负载。

平均负载有3个值:最近1分钟的、最近5分钟的和最近15分钟的平均负载。值越大说明系统 的负载越高。由于进程短期的突发性活动,出现最近1分钟的高负载值也很常见,但如果近15分钟内的平均负载都很高,就说明系统可能有问题。

Linux系统管理的要点在于定义究竟到什么程度才算是高负载。这个值取决于系统的硬件 配置以及系统上通常运行的程序。对某个系统来说是高负载的值可能对另一系统来说就 是正常值。通常,如果系统的负载值超过了2,就说明系统比较繁忙了。

第二行显示了进程概要信息——top命令的输出中将进程叫作任务(task):有多少进程处在 运行、休眠、停止或是僵化状态(僵化状态是指进程完成了,但父进程没有响应)。

下一行显示了CPU的概要信息。top根据进程的属主(用户还是系统)和进程的状态(运行、 空闲还是等待)将CPU利用率分成几类输出。

紧跟其后的两行说明了系统内存的状态。第一行说的是系统的物理内存:总共有多少内存, 当前用了多少,还有多少空闲。后一行说的是同样的信息,不过是针对系统交换空间(如果分配 了的话)的状态而言的。

最后一部分显示了当前运行中的进程的详细列表,有些列跟ps命令的输出类似。

默认情况下,top命令在启动时会按照%CPU值对进程排序。可以在top运行时使用多种交互 命令重新排序。每个交互式命令都是单字符,在top命令运行时键入可改变top的行为。键入f允许你选择对输出进行排序的字段,键入d允许你修改轮询间隔。键入q可以退出top。用户在top 命令的输出上有很大的控制权。用这个工具就能经常找出占用系统大部分资源的罪魁祸首。

pgrep

你可以用它获得一个特定命令的进程ID列表。

例如: