通过前面章节的一些实例的学习,想必你已经知道了使用 ps 命令可以查看进程的信息,但除了 ps 命令,我们还可以使用 pstree 命令和 pgrep 命令查看当前进程的信息。
使用 ps 命令,可以查看当前的进程。默认情况下,ps 命令只会输出当前用户并且是当前终端(比如,当前Shell)下调用的进程的信息。其输出将类似如下所示:
[www.cdsy.xyz]$ ps PID TTY TIME CMD 4380 pts/0 00:00:00 bash 4414 pts/0 00:00:00 ps
我们从上面的输出中可以看到,默认情况下,ps 命令会显示进程 ID(PID)、与进程关联的终端(TTY)、格式为“[dd-]hh:mm:ss”的进程累积 CPU 时间(TIME),以及可执行文件的名称(CMD)。并且,输出内容默认是不排序的。
使用标准语法显示系统中的每个进程:
[www.cdsy.xyz]$ ps -ef | head -2 UID PID PPID C STIME TTY TIME CMD root 1 0 0 Janl4 ? 00:00:02 init [5]
使用 BSD 语法显示系统中的每个进程:
[www.cdsy.xyz]$ ps aux | head -2 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 2160 648 ? Ss Janl4 0:02 init [5]
使用 BSD 样式选项会增加进程状态(STAT)等信息作为默认显示,你也可以使用 PS_FORMAT 环境变量重写默认的输出格式。
查看系统中 httpd 进程的信息:
使用 pstree 命令,可以显示进程树的信息:
[www.cdsy.xyz]$ pstree
init-+-acpid
|-atd
|-auditd-+-audispd---{audispd}
| `-{auditd}
|-automount---4*[{automount}]
|-avahi-daemon---avahi-daemon
|-crond---5*[crond-+-mj.sh]
| `-sendmail]
|-cupsd
|-dbus-daemon---{dbus-daemon}
|-events/0
|-events/1
|-gam_server
|-gpm
|-hald---hald-runner-+-hald-addon-acpi
| |-hald-addon-keyb
| `-hald-addon-stor
|-hcid
|-hidd
|-hpiod
|-java-+-java---17*[{java}]
| `-14*[{java}]
|-java-+-java---29*[{java}]
| `-14*[{java}]
|-java-+-java---34*[{java}]
| `-14*[{java}]
|-java---20*[{java}]
|-java---292*[{java}]
|-khelper
|-klogd
|-krfcommd
|-ksoftirqd/0
|-ksoftirqd/1
|-kthread-+-aio/0
| |-aio/1
| |-ata/0
| |-ata/1
| |-ata_aux
| |-cqueue/0
| |-cqueue/1
| |-hd-audio0
| |-kacpid
| |-kauditd
| |-kblockd/0
| |-kblockd/1
| |-khubd
| |-khungtaskd
| |-2*[kjournald]
| |-kmpath_handlerd
| |-kmpathd/0
| |-kmpathd/1
| |-kondemand/0
| |-kondemand/1
| |-kpsmoused
| |-kseriod
| |-ksnapd
| |-kstriped
| |-kswapd0
| |-2*[pdflush]
| |-rpciod/0
| |-rpciod/1
| |-scsi_eh_0
| |-scsi_eh_1
| |-scsi_eh_2
| |-scsi_eh_3
| |-scsi_eh_4
| `-scsi_eh_5
|-loop0
|-mcstransd
|-migration/0
|-migration/1
|-6*[mingetty]
|-mj.sh---make---java---11*[{java}]
|-ntpd
|-pcscd---{pcscd}
|-portmap
|-python
|-restorecond
|-rpc.idmapd
|-rpc.statd
|-screen---bash---update.sh---cvs
|-sendmail---2*[sendmail]
|-sendmail
|-setroubleshootd---2*[{setroubleshootd}]
|-smartd
|-sshd-+-sshd---bash---update_and_rest---cvs
| |-sshd---bash---pstree
| `-sshd---bash
|-start_derby.sh---java---45*[{java}]
|-surf---8*[{surf}]
|-syslogd
|-tomcat---sleep
|-udevd
|-watchdog/0
|-watchdog/1
|-xfs
|-xinetd
`-yum-updatesd
pstree 命令以树形结构的形式显示系统中所有当前运行的进程的信息。此树形结构以指定的 PID 为根,若没有指定 PID,则以 init 进程为根。下面,我们看一个显示指定 PID 的进程树的例子:
[www.cdsy.xyz]$ pstree 4578 httpd-11*[httpd]
上述输出内容的含义是,PID 是 4578 的 httpd 进程下有 11 个 httpd 子进程。在显示时,pstree 命令会将一样的分支合并到一个方括号中,并在方括号前显示重复的次数。
如果 pstree 命令指定的参数是用户名,那么就会显示以此用户的进程为根的所有进程树的信息。其显示内容将类似如下所示:
[www.cdsy.xyz]$ pstree mozhiyan
Xvnc
dbus-daemon
dbus-launch
dcopserver
gconfd-2
kded
kdeinit-+-bt-applet
|-esc-+-esc---9*[{esc}]
| `-esc---6*[{esc}]
|-2*[kio_file]
|-kio—media
|-klauncher
`-kwin
kdesktop
kicker
klipper
ksmserver
bash---pstree
start_kdeinit
xstartup---startkde---kwrapper
使用 pgrep 命令,可以基于名称或其他属性查找进程。
pgrep 命令会检查当前运行的进程,并列出与选择标准相匹配的进程的 ID。例如,查看 root 用户的 sshd 进程的 PID:
[www.cdsy.xyz]$ pgrep -u root sshd 2877 6572 18563
列出所有者是 root 和 daemon 的进程的 PID:

