bash shell命令与监测的那点事之ps
学习LInux,不得不谈谈bash shell命令,介绍Linux命令行与Shell脚本的书有很多很多,bash shell命令也有很多,此次我们只谈谈有关监测的事情。
探查进程
当程序运行在系统上时,我们称之为进程。想监测这些进程,需要熟悉ps命令的用法,ps命令好比工具的瑞士军刀,它能输出运行在系统上的所有程序的许多信息。
但是很蛋疼的是,随着它的稳健而来的是复杂性-数不清的参数,这或许让ps命令成为了最难掌握的命令。大多数系统管理员在掌握了能提供他们需要的一组参数后,就一直坚持只使用这组参数。默认情况下,ps命令并不会提供那么多的信息:
1 [root@controller ~]# ps 2 PID TTY TIME CMD 3 13918 pts/1 00:00:00 bash 4 14934 pts/1 00:00:00 ps
没什么特别的是吧?默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户的进程,在此例中,我们只运行了bash shell(注:shell也只是运行在系统上的另一个程序而已),以及ps命令自己。
上例中的基本输出显示了程序的进程号,(PID)、它们运行在哪个终端,以及进程已用的CPU时间。
Linux系统中使用的GNU ps命令支持3个不同类型的命令行参数:
- Unix风格的参数,前面加单破折线
- BSD风格的参数,前面不加破折线
- GNU风格的长参数,前面加双破折线
下面将进一步解析这三种不同的参数类型,并举例演示它们如何工作。
Unix风格的参数
-A | 显示所有进程 |
-N | 显示与指定参数不符的所有进程 |
-a | 显示除控制进程和无终端的进程外的所有进程 |
-d | 显示除控制进程外的所有进程 |
-e | 显示所有进程 |
-f | 显示完整格式的输出 |
-F | 显示更多的额外输出 |
-j | 显示任务信息 |
-l | 显示长列表 |
-H | 用层级格式来显示进程(树状、用来显示父进程) |
以上介绍的是常用的Unix风格的参数,下面举几个栗子:
1 [root@controller ~]# ps -ef 2 UID PID PPID C STIME TTY TIME CMD 3 root 1 0 0 Jul22 ? 00:14:42 /sbin/init 4 root 2 0 0 Jul22 ? 00:00:01 [kthreadd] 5 root 3 2 0 Jul22 ? 00:04:02 [migration/0] 6 root 4 2 0 Jul22 ? 00:03:33 [ksoftirqd/0] 7 root 5 2 0 Jul22 ? 00:00:00 [migration/0] 8 root 6 2 0 Jul22 ? 00:00:11 [watchdog/0] 9 root 7 2 0 Jul22 ? 00:04:00 [migration/1] 10 root 8 2 0 Jul22 ? 00:00:00 [migration/1] 11 root 9 2 0 Jul22 ? 00:03:53 [ksoftirqd/1] 12 root 10 2 0 Jul22 ? 00:00:10 [watchdog/1] 13 root 11 2 0 Jul22 ? 00:03:57 [migration/2] 14 root 12 2 0 Jul22 ? 00:00:00 [migration/2] 15 root 13 2 0 Jul22 ? 00:03:53 [ksoftirqd/2]
这个栗子中包含了两个参数:-e是指定显示所有运行在系统上的进程;-f是扩展了输出,这些扩展包含了以下信息:
- UID:启动这些进程的用户。
- PID:进程的进程号。
- PPID:父进程的进程号。
- C:进程生命周期中的CPU利用率。
- STIME:进程启动时的系统时间。
- TTY:进程启动时的终端设备。
- TIME:运行进程需要的累计CPU时间。
- CMD:启动的进程名称。
如果想获得更多的参数,可以用-l参数,它会产生一个长格式的输出:
1 [root@controller ~]# ps -l 2 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 3 4 S 0 13918 13914 0 80 0 - 27118 wait pts/1 00:00:00 bash 4 4 R 0 19675 13918 8 80 0 - 27034 - pts/1 00:00:00 ps 5 [root@controller ~]#
使用-l后出现的新的参数如下:
- F:内核分配给进程的系统标记。
- S:进程的状态:0代表正在运行;S代表在休眠;R代表可运行,正等待运行;Z代表僵化,进程已结束但父进程已不存在;T代表停止。
- PRI:进程的优先级(数字越大,代表优先级越低)。
- NI:谦让度值用来参与决定优先级。
- ADDR:进程的内存地址。
- SZ:假如进程被换出,所需交换空间的大致大小。
- WCHAN:进程休眠的内核函数地址。
BSD风格
了解了Unix风格的参数后,我们一起看一下BSD风格的参数。BSD(伯克利软件发行版)是加州大学伯克利分校开发的一个Unix版本。它和AT&T Unix系统有许多细小的不同。
BSD风格的命令参数
T | 显示当前终端关联的所有进程 |
a | 显示跟任意终端关联的所有进程 |
g | 显示所有进程,包括控制进程 |
r | 仅显示运行中的进程 |
j | 显示任务信息 |
x | 显示所有进程,甚至包括未分配任何终端的进程 |
l | 采用长模式 |
e | 显示命令使用的环境变量 |
f | 用分层格式来显示进程,表明哪些进程启动了哪些进程 |
h | 不显示头信息 |
如你所见,Unix和BSD类型的参数有很多重叠的地方,所以大多数情况,你只要选择自己喜欢的格式的参数类型就行了。
在使用BSD参数时,ps命令会自动改变输出以模仿BSD格式。下面举个栗子:
1 [root@controller ~]# ps l 2 F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 3 4 0 2683 1 20 0 4064 456 n_tty_ Ss+ tty2 0:00 /sbin/mingetty /dev/tty2 4 4 0 2685 1 20 0 4064 456 n_tty_ Ss+ tty3 0:00 /sbin/mingetty /dev/tty3 5 4 0 2694 1 20 0 4064 456 n_tty_ Ss+ tty4 0:00 /sbin/mingetty /dev/tty4 6 4 0 2705 1 20 0 4064 456 n_tty_ Ss+ tty5 0:00 /sbin/mingetty /dev/tty5 7 4 0 2707 1 20 0 4064 456 n_tty_ Ss+ tty6 0:00 /sbin/mingetty /dev/tty6 8 4 0 2724 2715 20 0 199372 23456 poll_s Ss+ tty1 8:29 /usr/bin/Xorg :0 -nr -verbose -audit 4 -auth /var/run/gdm/auth-for-gdm-9L52AZ/database -nolisten tcp vt1 9 4 0 3058 3054 20 0 195268 34792 poll_s Ss+ tty7 19:52 /usr/bin/Xorg :1 -br -verbose -audit 4 -auth /var/run/gdm/auth-for-gdm-6RkbH9/database -nolisten tcp 10 4 0 3713 3709 20 0 146720 3112 poll_s Ss+ tty8 1:28 /usr/bin/Xorg :2 -br -verbose -audit 4 -auth /var/run/gdm/auth-for-gdm-zqkSTu/database -nolisten tcp 11 4 0 7352 13918 20 0 108136 1004 - R+ pts/1 0:00 ps l 12 4 0 13918 13914 20 0 108472 1792 wait Ss pts/1 0:00 -bash 13 [root@controller ~]#
注意:大部分输出和使用Unix风格一样,但是有一小部分是不同的:
- VSZ:进程在内存中的大小,以KB为单位。
- RSS:进程在未换出时占用的物理内存。
- STAT:代表当前进程状态的双字符状态码。
在状态码中,BSD比Unix输出的信息更为详尽。第一个参数与Unix输出相同的值,但是第二个参数进一步说明进程的状态:
- <:该进程运行在高优先级上。
- N:该进程运行在低优先级上。
- L:进程有页面锁定在内存中。
- S:该进程是个控制进程。
- l:该进程是多线程的。
- +:该进程是运行在前端。
GNU全字参数
最后,GNU开发人员在这个新的整合过的ps命令中加入了另外一些参数。一些GNU全字参数复制了现有的Unix或BSD类型的参数,而一些提供了新功能。下面列出了GNU的一些命令参数。
--deselect | 显示所有进程,命令行中列出的进程 |
--contest | 显示额外的安全信息 |
--cols n | 将屏幕宽度设置为n列 |
--columns n | 将屏幕宽度设置为n列 |
--cumulative | 包含已停止的进程的信息 |
--forest | 用层级结构显示出进程和父进程之间的关系 |
--headers | 在每页输出中列出列的头 |
--lines n | 将屏幕高设置为n行 |
--rows | 将屏幕设置为n排 |
sort order | 指定将输出按哪列排序 |
你可以将GNU全字参数和Unix或BSD风格混用来定制输出。GNU中最好用的莫过于--forest参数。它会显示进程的层级信息,并用ASCII字符绘出萌萌的图表:
1 root 3054 2677 0 Aug01 ? 00:00:00 \_ /usr/libexec/gdm-simple-slave --display-id /org/gnome/DisplayManager/Display2 2 root 3058 3054 0 Aug01 tty7 00:19:52 | \_ /usr/bin/Xorg :1 -br -verbose -audit 4 -auth /var/run/gdm/auth-for-gdm-6RkbH9/database -nolisten tcp 3 root 3126 3054 0 Aug01 ? 00:00:00 | \_ pam: gdm-password 4 root 3158 3126 0 Aug01 ? 00:00:07 | \_ gnome-session 5 root 3259 3158 0 Aug01 ? 00:00:57 | \_ metacity 6 root 3261 3158 0 Aug01 ? 00:04:54 | \_ gnome-panel 7 root 3262 3158 0 Aug01 ? 00:00:49 | \_ nautilus 8 root 3302 3158 0 Aug01 ? 00:00:55 | \_ gnome-power-manager 9 root 3308 3158 0 Aug01 ? 00:00:00 | \_ gnome-volume-control-applet 10 root 3309 3158 0 Aug01 ? 00:00:03 | \_ abrt-applet 11 root 3310 3158 0 Aug01 ? 00:00:01 | \_ python /usr/share/system-config-printer/applet.py 12 root 3316 3158 0 Aug01 ? 00:00:00 | \_ /usr/libexec/polkit-gnome-authentication-agent-1