• 运维ps语法---》ps、pstree、top、htop、nice、renice、kill、ulimit、w 和 who 和 whoami、pgrep、fg 和 bg、ipcs


    Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。
    ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top 或者 htop 。
    kill 命令用于杀死进程。

    十二 个经典 Linux 进程管理命令介绍

    ps、pstree、top、htop、nice、renice、kill、ulimit、w 和 who 和 whoami、pgrep、fg 和 bg、ipcs

    ps
    ps 是 Linux 中最基础的浏览系统中的进程的命令。
    能列出系统中运行的进程,包括进程号、命令、CPU使用量、内存使用量等
    ps -a - 列出所有运行中/激活进程
    ps -ef |grep - 列出需要进程
    ps -aux - 显示进程信息,包括无终端的(x)和针对用户(u)的进程:如USER, PID, %CPU, %MEM等
    
    
    pstree 
    linux中,每一个进程都是由其父进程创建的。pstree以可视化方式显示进程,通过显示进程的树状图来展示进程间关系。
    如果指定了pid了,那么树的根是该pid,不然将会是init(pid: 1)。
    
    
    top
    top 是一个更加有用的命令,可以监视系统中不同的进程所使用的资源。它提供实时的系统状态信息。
    显示进程的数据包括 PID、进程属主、优先级、%CPU、%memory等。可以使用这些显示指示出资源使用量。
    
    
    htop
    htop与top很类似,但是htop是交互式的文本模式的进程查看器。
    它通过文字图形化地显示每一个进程的CPU和内存使用量、swap使用量。
    使用上下光标键选择进程,F7和F8改变优先级,F9杀死进程。Htop不是系统默认安装的,所以需要额外安装
    
    
    nice
    通过nice命令的帮助,用户可以设置和改变进程的优先级。提高一个进程的优先级,内核会分配更多CPU时间片给这个进程。
    默认情况下,进程以0的优先级启动。进程优先级可以通过top命令显示的NI(nice value)列查看。
    进程优先级值的范围从-20到19。值越低,优先级越高。
    nice <优先值> <进程名> - 通过给定的优先值启动一个程序
    
    
    renice
    renice命令类似nice命令。使用这个命令可以改变正在运行的进程优先值。
    注意,用户只能改变属于他们自己的进程的优先值。
    renice -n -p - 改变指定进程的优先值
    renice -u -g - 通过指定用户和组来改变进程优先值
    
    
    kill
    这个命令用于发送信号来结束进程。如果一个进程没有响应杀死命令,这也许就需要强制杀死,使用-9参数来执行。
    注意,使用强制杀死的时候一定要小心,因为进程没有时机清理现场,也许写入文件没有完成。
    如果我们不知道进程PID或者打算用名字杀死进程时候,killall就能派上用场。
    kill <pid>
    kill -9 <pid>
    killall -9 - 杀死所有拥有同样名字的进程
    如果你使用kill,你需要知道进程ID号。pkill是类似的命令,但使用模式匹配,如进程名,进程拥有者等。
    pkill <进程名>
    
    
    ulimit
    -f - 最大文件尺寸大小
    -v - 最大虚拟内存大小(KB)
    -n - 增加最大文件描述符数量
    -H : 改变和报告硬限制
    -S : 改变和报告软限制
    该命令用于控制系统资源在shell和进程上的分配量。
    对于系统管理员是最有用的,可以管理重度使用和存在性能问题的系统。
    限制资源大小可以确保重要进程持续运行,其他进程不会占用过多资源。
    ulimit -a - 显示当前用户关联的资源限制
    
    
    w 
    提供当前登录的用户及其正在执行的进程的信息。
    显示信息头包含信息,如当前时间、系统运行时长、登录用户总数、过去的1,5,15分钟内的负载均衡数。
    基于这些用户信息,用户在终止不属于他们的进程时要小心。
    
    
    who
    是和 w 类似命令,提供当前登录用户列表、系统启动时间、运行级别等。
    
    
    whoami 命令输出当前用户ID
    
    
    pgrep
    pgrep的意思是”进程号全局正则匹配输出”。
    该命令扫描当前运行进程,然后按照命令匹配条件列出匹配结果到标准输出。对于通过名字检索进程号是很有用。
    pgrep -u mint sh
    这个命令将会显示用户为‘mint’和进程名为‘sh’的进程ID。
    
    
    fg , bg
    有时,命令需要很长的时间才能执行完成。对于这种情况,我们使用‘bg’命令可以将任务放在后台执行,而用‘fg’可以调到前台来使用。
    我们可以通过‘&’在后台启动一个程序:
    find . -name *iso > /tmp/res.txt &
    一个正在运行的程序也可以通过“CTRL+Z”和“bg”命令组合放到后台运行。
    find . -name *iso > /tmp/res.txt &     -  启动一个程序
    ctrl+z      -   挂起当前执行程序
    bg   -  将程序放到后台运行
    我们可以使用‘jobs’命令列出所有后台进程。
    jobs
    使用‘fg’命令可以将后台程序调到前台执行。
    fg %进程id
    
    
    ipcs
    ipcs命令报告进程间通信设施状态。(共享内存,信号量和消息队列)
    用-p参数联合-m、-s或-q使用,可以获得相关的进程间通信的进程ID。
    ipcs -p -m

    linux上进程有5种状态

    5种进程状态

    1. 运行(正在运行或在运行队列中等待) 
    2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 
    3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生) 
    4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放) 
    5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行) 

    ps工具标识进程的5种状态码: 

    D 不可中断 uninterruptible sleep (usually IO) 
    R 运行 runnable (on run queue) 
    S 中断 sleeping 
    T 停止 traced or stopped 
    Z 僵死 a defunct (”zombie”) process

    ps命令支持三种使用的语法格式

    三种语法格式

    1.UNIX 风格,选项可以组合在一起,并且选项前必须有“-”连字符
    2.BSD 风格,选项可以组合在一起,但是选项前不能有“-”连字符
    3.GNU 风格的长选项,选项前有两个“-”连字符

    能够混用这几种风格,但是可能会发生冲突。较多使用 UNIX 风格的ps命令。

    日常生活中使用的ps命令的例子(UNIX 风格)。

    1. 不加参数执行ps命令. 这是一个基本的 ps 使用
    2. 显示所有当前进程. 使用 -a 参数。-a 代表 all。同时加上x参数会显示没有控制终端的进程。ps -ax | less
    3. 根据用户过滤进程. 在需要查看特定用户进程的情况下,我们可以使用 -u 参数。
       比如我们要查看用户'pungki'的进程,可以通过下面的命令: $ ps -u pungki
    4. 通过cpu和内存使用来过滤进程.  ps -aux | less   默认的结果集是未排序的。
       可以通过 --sort命令来排序。. 根据 CPU 使用来升序排序. ps -aux --sort -pcpu | less
       根据 内存使用 来升序排序 .ps -aux --sort -pmem | less
       ps -aux --sort -pcpu,+pmem | head -n 10
    5. 通过进程名和PID过滤
       使用 -C 参数,后面跟你要找的进程的名字。比如想显示一个名为getty的进程的信息,就可以使用下面的命令:
       $ ps -C getty
       如果想要看到更多的细节,我们可以使用-f参数来查看格式化的信息列表:$ ps -f -C getty
    6. 根据线程来过滤进程. 如果我们想知道特定进程的线程,可以使用-L 参数,后面加上特定的PID。$ ps -L 1213
    7. 树形显示进程. 有时候我们希望以树形结构显示进程,可以使用 -axjf 参数。 $ps -axjf. 或者使用另一个命令:pstree
    8. 显示安全信息. 如果想要查看现在有谁登入了你的服务器。可以使用ps命令加上相关参数:$ ps -eo pid,user,args
       参数 -e 显示所有进程信息,-o 参数控制输出。Pid,User 和 Args参数显示PID,运行应用的用户和该应用。
    9. 格式化输出root用户(真实的或有效的UID)创建的进程
       系统管理员想要查看由root用户运行的进程和这个进程的其他相关信息时,可以通过下面的命令:
       $ ps -U root -u root u
       -U 参数按真实用户ID(RUID)筛选进程,它会从用户列表中选择真实用户名或 ID。真实用户即实际创建该进程的用户。
       -u 参数用来筛选有效用户ID(EUID)。
       最后的u参数用来决定以针对用户的格式输出,由User, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME 和 COMMAND这几   列组成。
    10. 使用PS实时监控进程状态. ps 命令会显示你系统当前的进程状态,但是这个结果是静态的。
        当有一种情况,我们需要像上面第四点中提到的通过CPU和内存的使用率来筛选进程,并且我们希望结果能够每秒刷新一次。
        为此,我们可以将ps命令和watch命令结合起来。$ watch -n 1 ‘ps -aux --sort -pmem, -pcpu’
        如果输出太长,我们也可以限制它,比如前20条,我们可以使用head命令来做到。
        $ watch -n 1 ‘ps -aux --sort -pmem, -pcpu | head 20’
        这里的动态查看并不像top或者htop命令一样。但是使用ps的好处是你能够定义显示的字段,你能够选择你想查看的字段。
        举个例子,如果你只需要看名为'pungki'用户的信息,你可以使用下面的命令:
        $ watch -n 1 ‘ps -aux -U pungki u --sort -pmem, -pcpu | head 20’

    一些参数和使用实例

    一些参数

    -A    列出所有的进程
    -w    显示加宽可以显示较多的资讯
    -au    显示较详细的资讯
    -aux    显示所有包含其他使用者的行程
    ############################################################
    常用参数:
    -A 显示所有进程(等价于-e)(utility)
    -a 显示一个终端的所有进程,除了会话引线
    -N 忽略选择。
    -d 显示所有进程,但省略所有的会话引线(utility)
    -x 显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility)
    -p pid 进程使用cpu的时间
    -u uid or username 选择有效的用户id或者是用户名
    -g gid or groupname 显示组的所有进程。
    U username 显示该用户下的所有进程,且显示各个命令的详细路径。如:ps U zhang;(utility)
    -f 全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on.
    -l 长格式(有F,wchan,C 等字段)
    -j 作业格式
    -o 用户自定义格式。
    v 以虚拟存储器格式显示
    s 以信号格式显示
    -m 显示所有的线程
    -H 显示进程的层次(和其它的命令合用,如:ps -Ha)(utility)
    e 命令之后显示环境(如:ps -d e; ps -a e)(utility)
    h 不显示第一行

    使用实例

    ############################################################
    ps命令常用用法(方便查看系统进程)
    1)ps a 显示现行终端机下的所有程序,包括其他用户的程序。
    2)ps -A 显示所有进程。
    3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
    4)ps -e 此参数的效果和指定"A"参数相同。
    5)ps e 列出程序时,显示每个程序所使用的环境变量。
    6)ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
    7)ps -H 显示树状结构,表示程序间的相互关系。
    8)ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
    9)ps s 采用程序信号的格式显示程序状况。
    10)ps S 列出程序时,包括已中断的子程序资料。
    11)ps -t<终端机编号>  指定终端机编号,并列出属于该终端机的程序的状况。
    12)ps -u root  显示root用户信息
    13)ps x  显示所有程序,不以终端机来区分。
    最常用的方法是ps -aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。
    ############################################################
    实例3:显示所有进程信息,连同命令行
    	  命令:ps -ef
    实例4:ps 与grep 常用组合用法,查找特定进程
    	  命令:ps -ef|grep ssh
    实例5:将目前属于您自己这次登入的 PID 与相关信息列示出来
    	  命令:ps -l
    	说明:
       	各相关信息的意义:
       	F 代表这个程序的旗标 (flag), 4 代表使用者为 super user
       	S 代表这个程序的状态 (STAT),关于各 STAT 的意义将在内文介绍
       	UID 程序被该 UID 所拥有
       	PID 就是这个程序的 ID !
       	PPID 则是其上级父程序的ID
       	C CPU 使用的资源百分比
       	PRI 这个是 Priority (优先执行序) 的缩写,详细后面介绍
       	NI 这个是 Nice 值,在下一小节我们会持续介绍
       	ADDR 这个是 kernel function,指出该程序在内存的那个部分。如果是个 running的程序,一般就是 "-"
       	SZ 使用掉的内存大小
       	WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作
       	TTY 登入者的终端机位置
       	TIME 使用掉的 CPU 时间。
       	CMD 所下达的指令为何
       	在预设的情况下, ps 仅会列出与目前所在的 bash shell 有关的 PID 而已,所以, 当我使用 ps -l 的时候,只有三个 PID。
    实例6:列出目前所有的正在内存当中的程序
    	命令:ps aux
    说明:
    USER:该 process 属于那个使用者账号的
    PID :该 process 的号码
    %CPU:该 process 使用掉的 CPU 资源百分比
    %MEM:该 process 所占用的物理内存百分比
    VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
    RSS :该 process 占用的固定的内存量 (Kbytes)
    TTY :该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
    STAT:该程序目前的状态,主要的状态有
    R :该程序目前正在运作,或者是可被运作
    S :该程序目前正在睡眠当中 (可说是 idle 状态),但可被某些讯号 (signal) 唤醒。
    T :该程序目前正在侦测或者是停止了
    Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
    START:该 process 被触发启动的时间
    TIME :该 process 实际使用 CPU 运作的时间
    COMMAND:该程序的实际指令
    实例7:列出类似程序树的程序显示
    命令:ps -axjf
    实例8:找出与 cron 与 syslog 这两个服务有关的 PID 号码
    命令:ps aux | egrep '(cron|syslog)'
    
    3. 输出指定的字段
    命令:ps -o pid,ppid,pgrp,session,tpgid,comm
    
    注意:"ps aux"和"ps -aux"不相同。例如"-u"用来显示该用户的进程。但是"u"则是显示详细的信息。
    BSD风格:在BSD风格的语法选项前不带连字符。例如: ps aux 
    UNIX/LINUX的风格:在linux风格的语法选项前面有一个破折号.例如: ps -ef 
    混合使用两种Linux系统上的语法风格是好事儿。例如“ps ax -f”。
    1、显示所有进程:
    $ ps ax 
    $ ps -ef
    "u"或者"-f"参数来显示所有进程的详细信息
    $ ps aux 
    $ ps -ef -f 
    注意:为什么用户列不显示我的用户名,但显示其他用户,如root、www等,对于所有的用户名(包括你)如果长度大于8个字符,然后ps将只显示UID,而不是用户名。
    2、根据用户显示进程:
    由进程的所属用户使用“-u”选项后跟用户名来显示。多个用户名可以提供以逗号分隔。
    $ ps -f -u www-data 
    3、通过名字和进程ID显示进程:
    通过名字或命令搜索进程,使用“-C”选项后面加搜索词。
    $ ps -C apache2 
    4、根据CPU或者内存进行排序:
    “–sort”选项由逗号分隔的多个字段可以用指定。此外,该字段可以带有前缀“-”或“”符号,表示降序或升序分别排序。通过进程列表进行排序有很多参数,你可以检查手册页的完整列表。
    $ ps aux --sort=-pcpu,+pmem 
    $ ps aux --sort=-pcpu | head -5
    5、用树的风格显示进程的层次关系:
    许多进程实际上是一些父进程分的分支,知道这父子进程关系往往是有用的。在'–forest'选项将建立ASCII艺术风格层次的树视图。
    下面的命令将搜索进程名字为Apache2,形成一个树结构来显示详细的信息。
    $ ps -f --forest -C apache2 
    6、显示一个父进程的子进程:
    这里有一个例子显示所有apache进程的分支
    $ ps -o pid,uname,comm -C apache2 
    7、显示一个进程的线程:
    “-L”选项将显示进程的线程。它可以用来显示特定进程的所有线程或者所有进程。
    下面的命令将显示所有id为3150的进程所拥有的线程。
    $ ps -p 3150 -L 
    8、改变要显示的列:
    ps命令可以配置为只显示选中的列表。为了显示完整列表可以查看手册。
    下面的命令只显示PID,用户名,CPU,内存和命令的列。
    $ ps -e -o pid,uname,pcpu,pmem,comm 
    可以重命名列标签,相当的灵活。
    $ ps -e -o pid,uname=USERNAME,pcpu=CPU_USAGE,pmem,comm 
    9、显示进程运行的时间:
    表示进程的运行时间。对于运行的时间,列默认情况下是不显示的,可以使用“-O”选项查看。
    $ ps -e -o pid,comm,etime 
    10、把ps命令变成一个实时查看器:
    像往常一样,watch命令可以用来实时捕捉ps显示进程。简单的例子如下:
    $ watch -n 1 'ps -e -o pid,uname,cmd,pmem,pcpu --sort=-pmem,-pcpu | head -15' 

    要对系统中进程进行监测控制,查看状态,内存,CPU的使用情况,使用命令:/bin/ps
    (1) ps :是显示瞬间进程的状态,并不动态连续;
    (2) top:如果想对进程运行时间监控,应该用 top 命令;
    (3) kill 用于杀死进程或者给进程发送信号;
    (4) 查看文章最后的man手册,可以查看ps的每项输出的含义,to find: STANDARD FORMAT SPECIFIERS

    ===================================ps 的参数说明=============================
    l 长格式输出;
    u 按用户名和启动时间的顺序来显示进程;
    j 用任务格式来显示进程;
    f 用树形格式来显示进程;
    a 显示所有用户的所有进程(包括其它用户)。显示所有进程
    -a 显示同一终端下的所有程序
    x 显示无控制终端的进程;
    r 显示运行中的进程;
    ww 避免详细参数被截断;
    -A 列出所有的进程
    -w 显示加宽可以显示较多的资讯
    -au 显示较详细的资讯
    -aux 显示所有包含其他使用者的进程
    -e 显示所有进程,环境变量
    -f 全格式
    -h 不显示标题
    -l 长格式
    -w 宽输出
    a   显示终端上地所有进程,包括其他用户地进程
    r   只显示正在运行地进程
    x   显示没有控制终端地进程
    我们常用的选项是组合是 aux 或 lax,还有参数 f 的应用。
    pids 只列出进程标识符,之间运用逗号分隔.该进程列表必须在命令行参数地最后一个选项后面紧接着给出,中间不能插入空格.比如:ps -f1,4,5 显示的是进程ID为1,4,5的进程
    下介绍长命令行选项,这些选项都运用“--”开头:
    --sort X[+|-] key [,[+|-] key [,…]] 从SORT KEYS段中选一个多字母键.“+”字符是可选地,因为默认地方向就是按数字升序或者词典顺序,“-”字符是逆序排序(即降序).
    比如: ps -jax -sort=uid,-ppid,+pid.
    --help 显示帮助信息.
    --version 显示该命令地版本信息.
    在前面地选项说明中提到了排序键,接下来对排序键作进一步说明.需要注意地是排序中运用地值是ps运用地内部值,并非仅用于某些输出格式地伪值.排序键列表见下表.
    ============排序键列表==========================
    c cmd   可执行地简单名称 
    C cmdline   完整命令行 
    f flags   长模式标志 
    g pgrp   进程地组ID 
    G tpgid   控制tty进程组ID 
    j cutime   累计用户时间 
    J cstime   累计系统时间 
    k utime   用户时间 
    K stime   系统时间 
    m min_flt   次要页错误地数量 
    M maj_flt   重点页错误地数量 
    n cmin_flt 累计次要页错误 
    N cmaj_flt 累计重点页错误 
    o session   对话ID 
    p pid   进程ID 
    P ppid   父进程ID 
    r rss   驻留大小 
    R resident 驻留页 
    s size   内存大小(千字节) 
    S share   共享页地数量 
    t tty   tty次要设备号 
    T start_time 进程启动地时间 
    U uid   UID
    u user   用户名
    v vsize   总地虚拟内存数量(字节) 
    y priority 内核调度优先级

    ps aux 或 lax 输出的解释

    ========================================ps aux 或 lax 输出的解释=========================
    2、ps aux 或 lax 输出的解释
    au(x) 输出格式 : 
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    
    USER: 进程所有者
    PID: 进程ID
    %CPU: 占用的 CPU 使用率
    %MEM: 占用的内存使用率
    VSZ: 占用的虚拟内存大小
    RSS: 占用的内存大小
    TTY: 终端的次要装置号码 (minor device number of tty)
    STAT: 进程状态:
    START: 启动进程的时间; 
    TIME: 进程消耗CPU的时间;
    COMMAND:命令的名称和参数;

    进程 stat 状态

    =========================================进程STAT状态==================================
    D 无法中断的休眠状态(通常 IO 的进程); 
    R 正在运行,在可中断队列中; 
    S 处于休眠状态,静止状态; 
    T 停止或被追踪,暂停执行; 
    W 进入内存交换(从内核2.6开始无效); 
    X 死掉的进程; 
    Z 僵尸进程不存在但暂时无法消除;
    W: 没有足够的记忆体分页可分配
    WCHAN 正在等待的进程资源;
    <: 高优先级进程
    N: 低优先序进程
    L: 有记忆体分页分配并锁在记忆体内 (即时系统或捱A I/O),即,有些页被锁进内存
    
    s 进程的领导者(在它之下有子进程); 
    l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads); 
    + 位于后台的进程组;

    kill 终止进程

    ========================================kill 终止进程================================
    kill 终止进程
    有十几种控制进程的方法,下面是一些常用的方法:
    kill -STOP [pid] 
    发送SIGSTOP (17,19,23)停止一个进程,而并不消灭这个进程。
    kill -CONT [pid] 
    发送SIGCONT (19,18,25)重新开始一个停止的进程。
    kill -KILL [pid] 
    发送SIGKILL (9)强迫进程立即停止,并且不实施清理操作。
    kill -9 -1 
    终止你拥有的全部进程。
    SIGKILL 和 SIGSTOP 信号不能被捕捉、封锁或者忽略,但是,其它的信号可以。所以这是你的终极武器。

    ==================================================范例==============================
    $ ps
    PID TTY TIME COMMAND
    5800 ttyp0 00:00:00 bash
    5835 ttyp0 00:00:00 ps
    可以看到,显示地项目共分为四项,依次为PID(进程ID)、TTY(终端名称)、TIME(进程执行时 间)、COMMAND(该进程地命令行输入).
    可以运用u选项来查看进程所有者及其他少许详细信息,如下所示:
    $ ps u
    USER PID %CPU %MEM USZ RSS TTY STAT START TIME COMMAND
    test 5800 0.0 0.4 1892 1040 ttyp0 S Nov27 0:00 -bash
    test 5836 0.0 0.3 2528 856 ttyp0 R Nov27 0:00 ps u
    在bash进程前面有条横线,意味着该进程便是用户地登录shell,所以对于一个登录用户来说带短横线地进程只有一个.还可以看 到%CPU、%MEM两个选项,前者指该进程占用地CPU时间
    和总时间地百分比;后者指该进程占用地内存和总内存地百分比.
    在这种情况下看到了所有控制终端地进程;当然对于其他那些没有控制终端地进程 还是没有观察到,所以这时就需要运用x选项.运用x选项可以观察到所有地进程情况.
    1)ps a 显示现行终端机下的所有程序,包括其他用户的程序。
    2)ps -A 显示所有程序。
    3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
    4)ps -e 此参数的效果和指定"A"参数相同。
    5)ps e 列出程序时,显示每个程序所使用的环境变量。
    6)ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
    7)ps -H 显示树状结构,表示程序间的相互关系。
    8)ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
    9)ps s 采用程序信号的格式显示程序状况。
    10)ps S 列出程序时,包括已中断的子程序资料。
    11)ps -t<终端机编号>  指定终端机编号,并列出属于该终端机的程序的状况。
    12)ps u  以用户为主的格式来显示程序状况。
    13)ps x  显示所有程序,不以终端机来区分。


     最常用的方法是ps -aux,然后再用管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。
    ==================================================
    luther@gliethttp:~$ ps --help
    ********* simple selection ********* ********* selection by list *********
    -A all processes -C by command name
    -N negate selection -G by real group ID (supports names)
    -a all w/ tty except session leaders -U by real user ID (supports names)
    -d all except session leaders -g by session OR by effective group name
    -e all processes -p by process ID
    T all processes on this terminal -s processes in the sessions given
    a all w/ tty, including other users -t by tty
    g OBSOLETE -- DO NOT USE -u by effective user ID (supports names)
    r only running processes U processes for specified users
    x processes w/o controlling ttys t by tty
    *********** output format ********** *********** long options ***********
    -o,o user-defined -f full --Group --User --pid --cols --ppid
    -j,j job control s signal --group --user --sid --rows --info
    -O,O preloaded -o v virtual memory --cumulative --format --deselect
    -l,l long u user-oriented --sort --tty --forest --version
    -F extra full X registers --heading --no-heading --context
    ********* misc options *********
    -V,V show version L list format codes f ASCII art forest
    -m,m,-L,-T,H threads S children in sum -y change -l format
    -M,Z security data c true command name -c scheduling class
    -w,w wide output n numeric WCHAN,UID -H process hierarchy

    1监控io性能

    读写IO(Read/Write IO)操作

    磁盘是用来给我们存取数据用的,因此当说到IO操作的时候,就会存在两种相对应的操作,存数据时候对应的是写IO操作,取数据的时候对应的是是读IO操作。

    iostat和sar属于同一个包sysstat。

    iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

    iostat和sar –b命令效果差不多,主要用iostat –x选项。

    tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。"一次传输"意思是"一次I/O请求"。多个逻辑请求可能会被合并为"一次I/O请求"。"一次传输"请求的大小是未知的。

    kB_read/s:每秒从设备(drive expressed)读取的数据量;
    kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
    kB_read:读取的总数据量;

    iostat比较常用的选项-x,该选项将用于显示和io相关的扩展数据。

    rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。

    r/s:每秒完成的读 I/O 设备次数。即 delta(rio)/s

    w/s:每秒完成的写 I/O 设备次数。即 delta(wio)/s

    rsec/s:每秒读取的扇区数;

    wsec/:每秒写入的扇区数。

    rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算)

    wkB/s:每秒写K字节数。是 wsect/s 的一半。(需要计算)

    avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio)

    avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。毫无疑问,队列长度越短越好。

    await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。即 delta(ruse+wuse)/delta(rio+wio)

    这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。

    svctm:表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。。即 delta(use)/delta(rio+wio)
    %util: 在统计时间内所有处理IO时间,除以总共统计时间。即 delta(use)/s/1000 (因为use的单位为毫秒)。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度
    。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈。

    常用命令

    iostat -d -k 2参数 -d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;2表示,数据显示每隔2秒刷新一次。

    kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。

    iostat -d -k 1 10 #查看TPS和吞吐量信息(磁盘读写速度单位为KB)

    iostat -d -m 2 #查看TPS和吞吐量信息(磁盘读写速度单位为MB)

    iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await) iostat -c 1 10         #查看cpu状态

    iotop命令:yum安装, yum install iotop

    iotop是一个用来监视磁盘I/O使用状况的 top 类工具,可监测到哪一个程序使用的磁盘IO的信息

    iotop命令的键盘快捷键:

    1、左右箭头改变排序方式,默认是按IO排序

    2、r键是反向排序

    3、o键是只显示有IO输出的进程

    4、同样q是退出

    iotop定位负载来源进程

     iotop的本质是一个python脚本,从proc中获取thread的IO信息,进行汇总。

    从下图可以看出大部分的IO来源都来自于mysqld进程。因此可以确定dfa的负载来源是数据库

    2.free命令查看内存使用状况

    total:总计物理内存的大小。

    used:真正使用的实际内存大小

    free:剩余物理内存大小(没有被分配,纯剩余)。

    Shared:多个进程共享的内存总额。

    Buffers/cached:磁盘缓存的大小。

    第三行是交换分区SWAP的,也就是我们通常所说的虚拟内存。

    分配给buffer和cache的内存总共有多大。buffer和cache都是一部分内存,内存的作用是缓解CPU和IO的速度差距的。数据经过CPU计算,即将写入磁盘,这时用的内存为buffer;CPU要计算时,需要把数据从磁盘中读出来,临时先放到内存中,这部分内存就是cache。

    所以从应用程序的角度来说,total=used+free+buff/cathe

    available:系统可使用内存有多大,包含了free。Linux系统为了让应用跑的更快,会预先分配一部分内存(buffer/cache)给某些应用使用,虽然这部分内存并没有真正使用,但也已经分配出去了。然而,当另外一个服务要使用更多内存时,是可以把这部分预先分配的内存拿来用的,所以还没有被占用的这部分buffer和cache再加上free就是available。

    3.ps命令查看系统进程

    作为系统管理员,想查看所管理的系统都有那些进程在运行,在windows下只要打开任务管理器即可查看。在linux下,除了top命令,还有专门显示系统进程的命令。

    ps -elf 大同小异,显示的信息基本上是一样的。

    PID :进程的id,这个id很有用,在linux中内核管理进程就得靠pid来识别和管理某一个程,比如我想终止某一个进程,则用 'kill  进程的pid 有时并不能杀掉,则需要加一个-9选项了 kill  -9  进程pid

    STAT :表示进程的状态,进程状态分为以下几种(不要求记住,但要了解)

    D 不能中断的进程(通常为IO)

    R 正在运行中的进程

    S 已经中断的进程,通常情况下,系统中大部分进程都是这个状态

    T 已经停止或者暂停的进程,如果我们正在运行一个命令,比如说 sleep 10 如果我们按一下ctrl -z 让他暂停,那么我们用ps查看就会显示T这个状态

    W 这个好像是说,从内核2.6xx 以后,表示为没有足够的内存页分配

    X 已经死掉的进程(这个好像从来不会出现)

    Z 僵尸进程,杀不掉,打不死的垃圾进程,占系统一小点资源,不过没有关系。如果太多,就有问题了。一般不会出现。

    < 高优先级进程

    N 低优先级进程

    L 在内存中被锁了内存分页

    s 主进程

    l 多线程进程

    + 代表在前台运行的进程

    ps命令常会连同管道符一起使用,用来查看某个进程或者它的数量。

    3需要减掉1,因为使用grep命令时,grep命令本身也算一个进程。

    4.netstat 查看网络状况

    Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等。

    在 Internet RFC 标准中,Netstat 的定义是: Netstat 是在内核中访问网络及相关信息的程序,它能提供 TCP 连接,TCP 和 UDP 监听,进程内存管理的相关报告。

    常用的是netstat -lnp (打印当前系统启动哪些端口)和netstat  -an (打印网络连接状况)netstat -lntp 只看出tcp的,不包含socket

    协议(Proto):TCP,指是传输层通讯协议

    本地机器名(Local Address):Eagle,俗称计算机名了,安装系统时设置的,可以在"我的电脑"属性中修改,本地打开并用于连接的端口:22)

    远程机器名(Foreign Address)

    状态列表:

    LISTEN :在监听状态中。

    ESTABLISHED:已建立联机的联机情况。

    TIME_WAIT:该联机在目前已经是等待的状态。

    常用选项:

    -n 拒绝显示别名,能显示数字的全部转化成数字。
    -l 仅列出有在 Listen (监听) 的服務状态

    -p 显示建立相关链接的程序名

    -a (all)显示所有选项,默认不显示LISTEN相关

    -t (tcp)仅显示tcp相关选项

    -u (udp)仅显示udp相关选项

    -r 显示路由信息,路由表

    -e 显示扩展信息,例如uid等

    -s 按各个协议进行统计

    -c 每隔一个固定时间,执行该netstat命令。

    提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到

    ss -an 和nestat异曲同工

    分享一个小技巧:

    [root@greg-01 ~]# netstat -an | awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key,sta[key]}'

    LISTEN 4

    ESTABLISHED 1

    [root@greg-01 ~]# netstat -n|awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'

    ESTABLISHED 1

    首先 ^ 是开头的意思,就是说开头是TCP字样的,$NF表示最后一个字段,把它放入数组S中,然后自加,awk是采用的关联数组.END最后用for取出数组中的下标,也就是TCP的几种状态,然后对应该下标的值,就是统计的数量.

    5.抓包工具tcpdump

    某个网卡上都有哪些数据包,当初步判定您的服务器上有流量攻击。使用抓包工具来抓一下数据包,就可以知道有哪些IP在攻击了。

    yum install -y tcpdump 命令安装。

    tcpdump -nn -i ens33

    上例中第三列和第四列显示的信息为哪一个IP+port在连接哪一个IP+port,后面的信息是该数据包的相关信息。-i 选项后面跟设备名称,如果您想抓eth1网卡的包,后面则要跟eth1.至于-nn选项的作用是让第三列和第四列显示成IP+端口号的形式,如果不加-nn则显示的是主机名+服务名称。

    tcpdump -nn port 22//这样指定只抓22端口的包

    tcpdump -nn not port 22 and host 192.168.0.100 指定抓tcp的包,但是不要22端口的

    tcpdump -nn -c 100 -w /tmp/1.cap //抓一百个包写入/tmp/1.cap文件,这个文件要用tcpdump -r /tmp/1.cap查看

    wireshark工具

    安装yum install -y wireshark

    #tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"

    这条命令用于web服务器。类似于web访问日志,若服务器没有配置访问日志,可以临时使用该命令查看一下当前服务器上的web请求。在这里要注意的是,如果你的机器上没有开启web服务,是不会显示任何内容的。

    #tshark –n –i ens33 –R 'mysql.query' –T fields –e "ip.src" –e "mysql.query"

    上面的命令会抓取ens33网卡mysql的查询有哪些,不过这种方法仅仅适用于mysql的端口为3306的情况,如果不是3306,使用下面的方法。

    #tshark –i ens33 port 3307 –d tcp.port==3307,mysql –z "proto,colinfo,mysql.query,mysql.query"


    tshark命令选项:
    1. 抓包接口类
    -i 设置抓包的网络接口,不设置则默认为第一个非自环接口。
    -D 列出当前存在的网络接口。在不了解OS所控制的网络设备时,一般先用“tshark -D”查看网络接口的编号以供-i参数使用。
    -f 设定抓包过滤表达式(capture filter expression)。抓包过滤表达式的写法雷同于tcpdump,可参考tcpdump man page的有关部分。
    -s 设置每个抓包的大小,默认为65535,多于这个大小的数据将不会被程序记入内存、写入文件。(这个参数相当于tcpdump的-s,tcpdump默认抓包的大小仅为68)
    -p 设置网络接口以非混合模式工作,即只关心和本机有关的流量。
    -B 设置内核缓冲区大小,仅对windows有效。
    -y 设置抓包的数据链路层协议,不设置则默认为-L找到的第一个协议,局域网一般是EN10MB等。
    -L 列出本机支持的数据链路层协议,供-y参数使用。
    2. 抓包停止条件
    -c 抓取的packet数,在处理一定数量的packet后,停止抓取,程序退出。
    -a 设置tshark抓包停止向文件书写的条件,事实上是tshark在正常启动之后停止工作并返回的条件。条件写为test:value的形式,如“-a duration:5”表示tshark启动后在5秒内抓包然后停止;“-a filesize:10”表示tshark在输出文件达到10kB后停止;“-a files:n”表示tshark在写满n个文件后停止。(windows版的tshark0.99.3用参数“-a files:n”不起作用——会有无数多个文件生成。由于-b参数有自己的files参数,所谓“和-b的其它参数结合使用”无从说起。这也许是一个bug,或tshark的man page的书写有误。)
    3. 文件输出控制
    -b 设置ring buffer文件参数。ring buffer的文件名由-w参数决定。-b参数采用test:value的形式书写。“-b duration:5”表示每5秒写下一个ring buffer文件;“-b filesize:5”表示每达到5kB写下一个ring buffer文件;“-b files:7”表示ring buffer文件最多7个,周而复始地使用,如果这个参数不设定,tshark会将磁盘写满为止。
    4. 文件输入
    -r 设置tshark分析的输入文件。tshark既可以抓取分析即时的网络流量,又可以分析dump在文件中的数据。-r不能是命名管道和标准输入。
    5. 处理类
    -R 设置读取(显示)过滤表达式(read filter expression)。不符合此表达式的流量同样不会被写入文件。注意,读取(显示)过滤表达式的语法和底层相关的抓包过滤表达式语法不相同,它的语法表达要丰富得多,请参考http://www.ethereal.com/docs/dfref/和http://www.ethereal.com/docs/man-pages/ethereal-filter.4.html。类似于抓包过滤表达式,在命令行使用时最好将它们quote起来。
    -n 禁止所有地址名字解析(默认为允许所有)。
    -N 启用某一层的地址名字解析。“m”代表MAC层,“n”代表网络层,“t”代表传输层,“C”代表当前异步DNS查找。如果-n和-N参数同时存在,-n将被忽略。如果-n和-N参数都不写,则默认打开所有地址名字解析。
    -d 将指定的数据按有关协议解包输出。如要将tcp 8888端口的流量按http解包,应该写为“-d tcp.port==8888,http”。注意选择子和解包协议之间不能留空格。
    6. 输出类
    -w 设置raw数据的输出文件。这个参数不设置,tshark将会把解码结果输出到stdout。“-w-”表示把raw输出到stdout。如果要把解码结果输出到文件,使用重定向“>”而不要-w参数。
    -F 设置输出raw数据的格式,默认为libpcap。“tshark -F”会列出所有支持的raw格式。
    -V 设置将解码结果的细节输出,否则解码结果仅显示一个packet一行的summary。
    -x 设置在解码输出结果中,每个packet后面以HEX dump的方式显示具体数据。
    -T 设置解码结果输出的格式,包括text,ps,psml和pdml,默认为text。
    -t 设置解码结果的时间格式。“ad”表示带日期的绝对时间,“a”表示不带日期的绝对时间,“r”表示从第一个包到现在的相对时间,“d”表示两个相邻包之间的增量时间(delta)。
    -S 在向raw文件输出的同时,将解码结果打印到控制台。
    -l 在处理每个包时即时刷新输出。
    -X 扩展项。
    -q 设置安静的stdout输出(例如做统计时)
    -z 设置统计参数。
    7. 其它
    -h 显示命令行帮助。
    -v 显示tshark的版本信息。
    -o 重载选项。


  • 相关阅读:
    .NET WinForm下StatusStrip控件如何设置分隔线及部分子控件右对齐
    winform 弹出窗体指定位置
    命名空间“System.Web”中不存在类型或命名空间名称“Optimization”(是否缺少程序集引用?)
    SQL之case when then用法详解
    VS2015编译错误:调用的目标发生了异常--->此实现不是Windows平台FLPS验证的加密算法的一部分。
    .NET Core 控制台中文乱码问题!
    IOC 依赖注入 Unity
    《重构:改善代码的既有设计》读书笔记
    .NET中的堆(Heap)和栈(Stack)的本质
    浅谈 Sql Server 游标
  • 原文地址:https://www.cnblogs.com/duanlinxiao/p/10789360.html
Copyright © 2020-2023  润新知