进程是程序的运行实例(running instance)。运行在计算机中的多个进程都被分配了一个称为进程ID(PID)的唯一标识数字。同一个程序的多个实例可以同时运行,但是它们各自拥有不同PID和属性。进程属性包括拥有该进程的用户、进程使用的内存数量、进程占用的CPU时间等。这则攻略展示了如何收集进程的相关信息
和进程管理相关的重要命令是top、ps和pgrep。这些命令在所有的Linux发行版中都可以找到。
ps可以报告活跃进程的相关信息。这些信息包括:拥有进程的用户、进程的起始时间、进程对应的命令路径、PID、进程所属的终端(TTY)、进程使用的内存、进程占用的CPU等。例如:
$ ps
PID TTY TIME CMD
1220 pts/0 00:00:00 bash
1242 pts/0 00:00:00 ps
ps命令默认只显示从当前终端所启动的进程。第一列是PID,第二列是TTY,第三列是进程的运行时长,最后一列是CMD(进程所对应的命令)。
可以使用命令行参数来修改ps命令的输出。
选项-f(full)可以显示多列信息:
$ ps -f
UID PID PPID C STIME TTY TIME CMD
slynux 1220 1219 0 18:18 pts/0 00:00:00-bash
slynux 1587 1220 0 18:59 pts/0 00:00:00 ps -f
选项-e(every)和-ax(all)能够输出系统中运行的所有进程信息。
[插图]选项-x(配合-a)可以解除ps默认设置的TTY限制。通常如果使用不带参数的ps命令,只能打印出属于当前终端的进程。
命令ps -e、ps -ef、ps -ax以及ps -axf都能够生成包含所有进程的报告,提供比ps更多的信息:
$ ps -e | head -5
PID TTY TIME CMD
1 ? 00:00:00 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 migration/0
4 ? 00:00:00 ksoftirqd/0
选项-e产生的输出内容很多。我们使用head进行了过滤,只列出了其中的前5项。
选项-o PARAMETER1,PARAMETER2可以指定显示哪些数据。
-o的参数以逗号(,)作为分隔符。逗号与接下来的参数之间是没有空格的。
选项-o可以和选项-e配合使用(-oe)来列出系统中运行的所有进程。但如果在-o中需要使用过滤器,例如列出特定用户拥有的进程,那就不能再搭配-e了。因为-e和过滤器结合使用没有任何实际效果,依旧会显示所有的进程。
在下面的例子中,comm代表COMMAND,pcpu代表CPU占用率:
$ ps -eo comm,pcpu | head -5
COMMAND %CPU
init 0.0
kthreadd 0.0
migration/0 0.0
ksoftirqd/0 0.0
选项-o可以使用不同的参数,这些参数及其描述如表所示
① 简单命令是我们平时使用最频繁的一类命令。它是由空白字符分隔的一系列单词,以shell控制操作符作为结尾。第一个单词指定要执行的命令,余下的单词作为命令参数。shell控制操作符可以是换行符,或者是||、&&、&、;、;;、|、|&、(、)。详情可参阅Bash Reference Manual
ps可以配合grep以及其他工具生成定制的报告。
有些进程依赖于所定义的环境变量。了解这些环境变量及其取值有助于调试或定制进程。
ps命令通常并不会显示进程的环境信息。输出修饰符e可以将其添加到命令尾部:
$ ps e
请看下面的例子:
$ ps -eo pid,cmd e | tail -n 1
1238-bash USER=slynux LOGNAME=slynux HOME=/home/slynux
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAIL=/var/mail/slynux SHELL=/bin/bash SSH_CLIENT=10.211.55.249277 22
SSH_CONNECTION=10.211.55.249277 10.211.55.4 22 SSH_TTY=/dev/pts/0
环境信息可以帮助跟踪apt-get包管理器在使用过程中出现的问题。如果你是通过HTTP代理连接到Internet,你也许需要使用http_proxy=host:port来设置环境变量。如果没有设置的话,apt-get会无法找到代理服务器,进而返回错误信息。只要知道了是没有设置http_proxy,问题就好解决了。
ps命令能够输出进程的PID,但是从子进程一直跟踪到最终的父进程是一件非常枯燥的事。在ps命令的尾部加上f就可以创建进程的树状视图,显示出任务之间的父子关系。下面的例子展示了bash shell所调用的ssh会话,前者运行在xterm中:
$ ps -u clif f | grep -A2 xterm | head -3
15281 ? S 0:00 xterm
15284 pts/20 Ss+ 0:00 \_ bash
15286 pts/20 S+ 0:18 \_ ssh 192.168.1.2
ps命令的输出默认是没有经过排序的。选项--sort可以强制ps对输出排序。参数前的+表示升序,-表示降序:
$ ps [OPTIONS] --sort -paramter1,+parameter2,parameter3..
例如,要列出占用CPU最多的前5个进程:
$ ps -eo comm,pcpu --sort -pcpu | head -5
COMMAND %CPU
Xorg 0.1
hald-addon-stor 0.0
ata/0 0.0
scsi_eh_0 0.0
输出中显示了依据CPU占用率进行降序排列的前5个进程。
grep可以过滤ps的输出。要想找出当前运行的所有Bash进程,可以使用:
$ ps -eo comm,pid,pcpu,pmem | grep bash
bash 1255 0.0 0.3
bash 1680 5.5 0.3
4.根据真实用户/ID以及有效用户/ID过滤ps输出
ps命令可以根据指定的真实/有效用户名或ID(real and effective username or ID)对进程进行分组。通过检查每一条输出是否属于参数列表中指定的有效用户或真实用户,ps就能够过滤输出。
❏ 使用-u EUSER1,EUSER2 …指定有效用户列表;
❏ 使用-U RUSER1,RUSER2 …指定真实用户列表。
例如:
# 显示以root作为有效用户ID和真实用户ID的用户以及CPU占用率
$ ps -u root -U root -o user,pcpu
-o可以和-e结合成-eo的形式,但如果使用了过滤器,就不能再使用-e了,它会使过滤器选项失效。
可以通过指定进程所属的TTY来选择ps的输出。选项-t可以指定TTY列表:
$ ps -t TTY1, TTY2 ..
例如:
$ ps -t pts/0,pts/1
PID TTY TIME CMD
1238 pts/0 00:00:00 bash
1835 pts/1 00:00:00 bash
1864 pts/0 00:00:00 ps
留言与评论(共有 0 条评论) “” |