zoukankan      html  css  js  c++  java
  • ps命令

    原文

    Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。

      要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。

      ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top 工具。

      kill 命令用于杀死进程。

      linux上进程有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 

    1.命令格式:

      ps[参数]

    2.命令功能:

      用来显示当前进程的状态

    3.命令参数:

    a  显示所有进程

    -a 显示同一终端下的所有程序

    -A 显示所有进程

    c  显示进程的真实名称

    -N 反向选择

    -e 等于“-A”

    e  显示环境变量

    f  显示程序间的关系

    -H 显示树状结构

    r  显示当前终端的进程

    T  显示当前终端的所有程序

    u  指定用户的所有进程

    -au 显示较详细的资讯

    -aux 显示所有包含其他使用者的行程 

    -C<命令> 列出指定命令的状况

    --lines<行数> 每页显示的行数

    --width<字符数> 每页显示的字符数

    --help 显示帮助信息

    --version 显示版本显示

    4.使用实例:

    实例1:显示所有进程信息

    命令:

      ps -A

    输出:

    [root@localhost test6]# ps -A
    
      PID TTY          TIME CMD
    ?        00:00:00 init
    ?        00:00:01 migration/0
    ?        00:00:00 ksoftirqd/0
    ?        00:00:01 migration/1
    ?        00:00:00 ksoftirqd/1
    ?        00:29:57 events/0
    ?        00:00:00 events/1
    ?        00:00:00 khelper
    ?        00:00:00 kthread
    ?        00:00:00 kblockd/0
    ?        00:00:00 kblockd/1
    ?        00:00:00 kacpid
    ?        00:00:00 cqueue/0
    
      ……省略部分结果

    说明:

    实例2:显示指定用户信息

    命令:

      ps -u root

    输出:

    [root@localhost test6]# ps -u root
    
      PID TTY          TIME CMD
    ?        00:00:00 init
    ?        00:00:01 migration/0
    ?        00:00:00 ksoftirqd/0
    ?        00:00:01 migration/1
    ?        00:00:00 ksoftirqd/1
    ?        00:29:57 events/0
    ?        00:00:00 events/1
    ?        00:00:00 khelper
    ?        00:00:00 kthread
    ?        00:00:00 kblockd/0
    ?        00:00:00 kblockd/1
    ?        00:00:00 kacpid
    
        ……省略部分结果

    说明:

    实例3:显示所有进程信息,连同命令行

    命令:

      ps -ef

    输出:

    [root@localhost test6]# ps -ef
    
    UID        PID  PPID  C STIME TTY          TIME CMD
    
    root         1     0  0 Nov02 ?        00:00:00 init [3]                  
    
    root         2     1  0 Nov02 ?        00:00:01 [migration/0]
    
    root         3     1  0 Nov02 ?        00:00:00 [ksoftirqd/0]
    
    root         4     1  0 Nov02 ?        00:00:01 [migration/1]
    
    root         5     1  0 Nov02 ?        00:00:00 [ksoftirqd/1]
    
    root         6     1  0 Nov02 ?        00:29:57 [events/0]
    
    root         7     1  0 Nov02 ?        00:00:00 [events/1]
    
    root         8     1  0 Nov02 ?        00:00:00 [khelper]
    
    root        49     1  0 Nov02 ?        00:00:00 [kthread]
    
    root        54    49  0 Nov02 ?        00:00:00 [kblockd/0]
    
    root        55    49  0 Nov02 ?        00:00:00 [kblockd/1]
    
    root        56    49  0 Nov02 ?        00:00:00 [kacpid]
    
    ……省略部分结果

    说明:

    实例4: ps 与grep 常用组合用法,查找特定进程

    命令:

      ps -ef|grep ssh

    输出:

    [root@localhost test6]# ps -ef|grep ssh
    
    root      2720     1  0 Nov02 ?        00:00:00 /usr/sbin/sshd
    
    root     17394  2720  0 14:58 ?        00:00:00 sshd: root@pts/0 
    
    root     17465 17398  0 15:57 pts/0    00:00:00 grep ssh

    说明:

    实例5:将目前属于您自己这次登入的 PID 与相关信息列示出来

    命令:

      ps -l

    输出:

    [root@localhost test6]# ps -l
    
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    S     0 17398 17394  0  75   0 - 16543 wait   pts/0    00:00:00 bash
    R     0 17469 17398  0  77   0 - 15877 -      pts/0    00:00:00 ps

    说明:

    各相关信息的意义:

    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

    输出:

    [root@localhost test6]# ps aux
    
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    
    root         1  0.0  0.0  10368   676 ?        Ss   Nov02   0:00 init [3]                  
    
    root         2  0.0  0.0      0     0 ?        S<   Nov02   0:01 [migration/0]
    
    root         3  0.0  0.0      0     0 ?        SN   Nov02   0:00 [ksoftirqd/0]
    
    root         4  0.0  0.0      0     0 ?        S<   Nov02   0:01 [migration/1]
    
    root         5  0.0  0.0      0     0 ?        SN   Nov02   0:00 [ksoftirqd/1]
    
    root         6  0.0  0.0      0     0 ?        S<   Nov02  29:57 [events/0]
    
    root         7  0.0  0.0      0     0 ?        S<   Nov02   0:00 [events/1]
    
    root         8  0.0  0.0      0     0 ?        S<   Nov02   0:00 [khelper]
    
    root        49  0.0  0.0      0     0 ?        S<   Nov02   0:00 [kthread]
    
    root        54  0.0  0.0      0     0 ?        S<   Nov02   0:00 [kblockd/0]
    
    root        55  0.0  0.0      0     0 ?        S<   Nov02   0:00 [kblockd/1]
    
    root        56  0.0  0.0      0     0 ?        S<   Nov02   0:00 [kacpid]
    
    ……省略部分结果

    说明:

    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

    输出:

    [root@localhost test6]# ps -axjf
    
    Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
    
     PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
        1     1     1 ?           -1 Ss       0   0:00 init [3]                  
        2     1     1 ?           -1 S<       0   0:01 [migration/0]
        3     1     1 ?           -1 SN       0   0:00 [ksoftirqd/0]
        4     1     1 ?           -1 S<       0   0:01 [migration/1]
        5     1     1 ?           -1 SN       0   0:00 [ksoftirqd/1]
        6     1     1 ?           -1 S<       0  29:58 [events/0]
        7     1     1 ?           -1 S<       0   0:00 [events/1]
        8     1     1 ?           -1 S<       0   0:00 [khelper]
       49     1     1 ?           -1 S<       0   0:00 [kthread]
       54     1     1 ?           -1 S<       0   0:00  \_ [kblockd/0]
       55     1     1 ?           -1 S<       0   0:00  \_ [kblockd/1]
       56     1     1 ?           -1 S<       0   0:00  \_ [kacpid]

    说明:

    实例8:找出与 cron 与 syslog 这两个服务有关的 PID 号码

    命令:

    输出:

    [root@localhost test6]# ps aux | egrep '(cron|syslog)'
    
    root      2682  0.0  0.0  83384  2000 ?        Sl   Nov02   0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
    
    root      2735  0.0  0.0  74812  1140 ?        Ss   Nov02   0:00 crond
    
    root     17475  0.0  0.0  61180   832 pts/0    S+   16:27   0:00 egrep (cron|syslog)
    
    [root@localhost test6]#

    说明:

     

    其他实例:

    1. 可以用 | 管道和 more 连接起来分页查看

    命令:

      ps -aux |more

    2. 把所有进程显示出来,并输出到ps001.txt文件

    命令:

      ps -aux > ps001.txt

    3. 输出指定的字段

    命令:

       ps -o pid,ppid,pgrp,session,tpgid,comm

    输出:

    [root@localhost test6]# ps -o pid,ppid,pgrp,session,tpgid,comm
    
      PID  PPID  PGRP  SESS TPGID COMMAND
    17394 17398 17398 17478 bash
    17398 17478 17398 17478 ps
    
    [root@localhost test6]#

    Linux作为Unix的衍生操作系统,Linux内建有查看当前进程的工具ps。这个工具能在命令行中使用。

    PS 命令是什么

    查看它的man手册可以看到,ps命令能够给出当前系统中进程的快照。它能捕获系统在某一事件的进程状态。如果你想不断更新查看的这个状态,可以使用top命令。

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

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

    我们能够混用这几种风格,但是可能会发生冲突。本文使用 UNIX 风格的ps命令。这里有在日常生活中使用较多的ps命令的例子。

    1. 不加参数执行ps命令

    这是一个基本的 ps 使用。在控制台中执行这个命令并查看结果。

    不加选项执行ps命令

    不加选项执行ps命令

    结果默认会显示4列信息。

    • PID: 运行着的命令(CMD)的进程编号
    • TTY: 命令所运行的位置(终端)
    • TIME: 运行着的该命令所占用的CPU处理时间
    • CMD: 该进程所运行的命令

    这些信息在显示时未排序。

    2. 显示所有当前进程

    使用 -a 参数。-a 代表 all。同时加上x参数会显示没有控制终端的进程。

    $ ps -ax
    

    这个命令的结果或许会很长。为了便于查看,可以结合less命令和管道来使用。

    $ ps -ax | less
    

    ps all 信息

    ps all 信息

    3. 根据用户过滤进程

    在需要查看特定用户进程的情况下,我们可以使用 -u 参数。比如我们要查看用户'pungki'的进程,可以通过下面的命令:

    $ ps -u pungki
    

    通过用户过滤

    通过用户过滤

    4. 通过cpu和内存使用来过滤进程

    也许你希望把结果按照 CPU 或者内存用量来筛选,这样你就找到哪个进程占用了你的资源。要做到这一点,我们可以使用 aux 参数,来显示全面的信息:

    $ ps -aux | less
    

    显示全面信息

    显示全面信息

    当结果很长时,我们可以使用管道和less命令来筛选。

    默认的结果集是未排好序的。可以通过 --sort命令来排序。

    根据 CPU 使用来升序排序

    $ ps -aux --sort -pcpu | less
    

    根据cpu使用排序

    根据cpu使用排序

    根据 内存使用 来升序排序

    $ ps -aux --sort -pmem | less
    

    根据内存使用来排序

    根据内存使用来排序

    我们也可以将它们合并到一个命令,并通过管道显示前10个结果:

    $ ps -aux --sort -pcpu,+pmem | head -n 10
    

    5. 通过进程名和PID过滤

    使用 -C 参数,后面跟你要找的进程的名字。比如想显示一个名为getty的进程的信息,就可以使用下面的命令:

    $ ps -C getty
    

    通过进程名和PID过滤

    通过进程名和PID过滤

    如果想要看到更多的细节,我们可以使用-f参数来查看格式化的信息列表:

    $ ps -f -C getty
    

    通过进程名和PID过滤

    通过进程名和PID过滤

    6. 根据线程来过滤进程

    如果我们想知道特定进程的线程,可以使用-L 参数,后面加上特定的PID。

    $ ps -L 1213
    

    根据线程来过滤进程

    根据线程来过滤进程

    7. 树形显示进程

    有时候我们希望以树形结构显示进程,可以使用 -axjf 参数。

    $ps -axjf
    

    树形显示进程

    树形显示进程

    或者可以使用另一个命令。

    $ pstree
    

    树形显示进程

    树形显示进程

    8. 显示安全信息

    如果想要查看现在有谁登入了你的服务器。可以使用ps命令加上相关参数:

    $ ps -eo pid,user,args
    

    参数 -e 显示所有进程信息,-o 参数控制输出。Pid,User 和 Args参数显示PID,运行应用的用户该应用

    显示安全信息

    显示安全信息

    能够与-e 参数 一起使用的关键字是args, cmd, comm, command, fname, ucmd, ucomm, lstart, bsdstart 和 start

    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这几列组成。

    这里有上面的命令的输出结果:

    show real and effective User ID

    show real and effective User ID

    10. 使用PS实时监控进程状态

    ps 命令会显示你系统当前的进程状态,但是这个结果是静态的。

    当有一种情况,我们需要像上面第四点中提到的通过CPU和内存的使用率来筛选进程,并且我们希望结果能够每秒刷新一次。为此,我们可以将ps命令和watch命令结合起来

    $ watch -n 1 ‘ps -aux --sort -pmem, -pcpu’
    

    组合 ps 和 watch

    组合 ps 和 watch

    如果输出太长,我们也可以限制它,比如前20条,我们可以使用head命令来做到。

    $ watch -n 1 ‘ps -aux --sort -pmem, -pcpu | head 20’
    

    组合 ps 和 watch

    组合 ps 和 watch

    这里的动态查看并不像top或者htop命令一样。但是使用ps的好处是你能够定义显示的字段,你能够选择你想查看的字段。

    举个例子,如果你只需要看名为'pungki'用户的信息,你可以使用下面的命令:

    $ watch -n 1 ‘ps -aux -U pungki u --sort -pmem, -pcpu | head 20’
    

    组合 ps 和 watch

    组合 ps 和 watch

    结论

    你也许每天都会使用ps命令来监控你的Linux系统。但是事实上,你可以通过ps命令的参数来生成各种你需要的报表。

    ps命令的另一个优势是ps是各种 Linux系统都默认安装的,因此你只要用就行了。

    不要忘了通过 man ps来查看更多的参数。(LCTT 译注:由于 ps 命令古老而重要,所以它在不同的 UNIX、BSD、Linux 等系统中的参数不尽相同,因此如果你用的不是 Linux 系统,请查阅你的文档了解具体可用的参数。)


    via: http://linoxide.com/how-tos/linux-ps-command-examples/

    原文https://linux.cn/article-4743-1.html?pr

    说明:

     

    其他实例:

    1. 可以用 | 管道和 more 连接起来分页查看

    命令:

      ps -aux |more

    2. 把所有进程显示出来,并输出到ps001.txt文件

    命令:

      ps -aux > ps001.txt

    3. 输出指定的字段

    命令:

       ps -o pid,ppid,pgrp,se

  • 相关阅读:
    Nodejs 进阶:Express 常用中间件 body-parser 实现解析
    Nodejs进阶:express+session实现简易身份认证
    Node 进阶:express 默认日志组件 morgan 从入门使用到源码剖析
    Nodejs进阶:如何玩转子进程(child_process)
    express+session实现简易身份认证
    你真的了解UIViewController生命周期吗?
    你真的了解UIGestureRecognizer吗?
    你真的了解UIEvent、UITouch吗?
    你真的了解UIScrollView吗?
    你真的了解UITextView吗?
  • 原文地址:https://www.cnblogs.com/tan-y-q/p/10946050.html
Copyright © 2011-2022 走看看