通过前面章节的一些实例的学习,想必你已经知道了使用 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: