zoukankan      html  css  js  c++  java
  • bash shell命令与监测的那点事(一)

    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
    评论
  • 相关阅读:
    UVA 1386 Cellular Automaton
    ZOJ 3331 Process the Tasks
    CodeForces 650B Image Preview
    CodeForces 650A Watchmen
    CodeForces 651B Beautiful Paintings
    CodeForces 651A Joysticks
    HUST 1601 Shepherd
    HUST 1602 Substring
    HUST 1600 Lucky Numbers
    POJ 3991 Seinfeld
  • 原文地址:https://www.cnblogs.com/voidy/p/4100841.html
Copyright © 2011-2022 走看看