• Linux shell编程学习笔记59: ps 获取系统进程信息,类似于Windows系统中的tasklist 命令


    0 前言

    系统进程信息是电脑网络信息安全检查中的一块重要内容,对于使用Linux和基于Linux作为操作系统的电脑来说,可以使用ps命令。

    1 ps命令 的功能、格式和选项说明

    1.1 ps命令 的功能

    Linux 中的ps(意为:process status)命令用于显示当前进程的状态,类似于Windows系统中的tasklist 命令,我们可以查看系统中运行的进程信息,包括进程的ID、父进程ID、CPU和内存占用等信息,并可以根据需求进行进一步的过滤和排序。

    我们可以使用命令 ps --help 来查看ps命令的帮助信息。

    1. [purpleendurer @ bash ~ ] ps --help
    2. Usage:
    3. ps [options]
    4. Try 'ps --help '
    5. or 'ps --help '
    6. for additional help text.
    7. For more details see ps(1).
    8. [purpleendurer @ bash ~ ]

     1.2 ps命令的格式

    ps [选项]   

    1.3 ps命令的选项

     ps命令的选项非常多。

    1. [purpleendurer @ bash ~ ] ps --help simple
    2. Usage:
    3. ps [options]
    4. Basic options:
    5. -A, -e all processes
    6. -a all with tty, except session leaders
    7. a all with tty, including other users
    8. -d all except session leaders
    9. -N, --deselect negate selection
    10. r only running processes
    11. T all processes on this terminal
    12. x processes without controlling ttys
    13. For more details see ps(1).

     

    1. [purpleendurer @ bash ~ ] ps --help list
    2. Usage:
    3. ps [options]
    4. Selection by list:
    5. -C <command> command name
    6. -G, --Group <GID> real group id or name
    7. -g, --group <group> session or effective group name
    8. -p, p, --pid <PID> process id
    9. --ppid <PID> parent process id
    10. -q, q, --quick-pid <PID>
    11. process id (quick mode)
    12. -s, --sid <session> session id
    13. -t, t, --tty <tty> terminal
    14. -u, U, --user <UID> effective user id or name
    15. -U, --User <UID> real user id or name
    16. The selection options take as their argument either:
    17. a comma-separated list e.g. '-u root,nobody' or
    18. a blank-separated list e.g. '-p 123 4567'
    19. For more details see ps(1).
    20. [purpleendurer @ bash ~ ]

    1. [purpleendurer @ bash ~ ] ps --help output
    2. Usage:
    3. ps [options]
    4. Output formats:
    5. -F extra full
    6. -f full-format, including command lines
    7. f, --forest ascii art process tree
    8. -H show process hierarchy
    9. -j jobs format
    10. j BSD job control format
    11. -l long format
    12. l BSD long format
    13. -M, Z add security data (for SELinux)
    14. -O <format> preloaded with default columns
    15. O <format> as -O, with BSD personality
    16. -o, o, --format <format>
    17. user-defined format
    18. s signal format
    19. u user-oriented format
    20. v virtual memory format
    21. X register format
    22. -y do not show flags, show rss vs. addr (used with -l)
    23. --context display security context (for SELinux)
    24. --headers repeat header lines, one per page
    25. --no-headers do not print header at all
    26. --cols, --columns, --width <num>
    27. set screen width
    28. --rows, --lines <num>
    29. set screen height
    30. For more details see ps(1).
    31. [purpleendurer @ bash ~ ]

    1. [purpleendurer @ bash ~ ] ps --help threads
    2. Usage:
    3. ps [options]
    4. Show threads:
    5. H as if they were processes
    6. -L possibly with LWP and NLWP columns
    7. -m, m after processes
    8. -T possibly with SPID column
    9. For more details see ps(1).
    10. [purpleendurer @ bash ~ ]

    1. [purpleendurer @ bash ~ ] ps --help misc
    2. Usage:
    3. ps [options]
    4. Miscellaneous options:
    5. -c show scheduling class with -l option
    6. c show true command name
    7. e show the environment after command
    8. k, --sort specify sort order as: [+|-]key[,[+|-]key[,...]]
    9. L show format specifiers
    10. n display numeric uid and wchan
    11. S, --cumulative include some dead child process data
    12. -y do not show flags, show rss (only with -l)
    13. -V, V, --version display version information and exit
    14. -w, w unlimited output width
    15. --help <simple|list|output|threads|misc|all>
    16. display help and exit
    17. For more details see ps(1).
    18. [purpleendurer @ bash ~ ]

    1. [purpleendurer @ bash ~ ] ps --help all
    2. Usage:
    3. ps [options]
    4. Basic options:
    5. -A, -e all processes
    6. -a all with tty, except session leaders
    7. a all with tty, including other users
    8. -d all except session leaders
    9. -N, --deselect negate selection
    10. r only running processes
    11. T all processes on this terminal
    12. x processes without controlling ttys
    13. Selection by list:
    14. -C <command> command name
    15. -G, --Group <GID> real group id or name
    16. -g, --group <group> session or effective group name
    17. -p, p, --pid <PID> process id
    18. --ppid <PID> parent process id
    19. -q, q, --quick-pid <PID>
    20. process id (quick mode)
    21. -s, --sid <session> session id
    22. -t, t, --tty <tty> terminal
    23. -u, U, --user <UID> effective user id or name
    24. -U, --User <UID> real user id or name
    25. The selection options take as their argument either:
    26. a comma-separated list e.g. '-u root,nobody' or
    27. a blank-separated list e.g. '-p 123 4567'
    28. Output formats:
    29. -F extra full
    30. -f full-format, including command lines
    31. f, --forest ascii art process tree
    32. -H show process hierarchy
    33. -j jobs format
    34. j BSD job control format
    35. -l long format
    36. l BSD long format
    37. -M, Z add security data (for SELinux)
    38. -O <format> preloaded with default columns
    39. O <format> as -O, with BSD personality
    40. -o, o, --format <format>
    41. user-defined format
    42. s signal format
    43. u user-oriented format
    44. v virtual memory format
    45. X register format
    46. -y do not show flags, show rss vs. addr (used with -l)
    47. --context display security context (for SELinux)
    48. --headers repeat header lines, one per page
    49. --no-headers do not print header at all
    50. --cols, --columns, --width <num>
    51. set screen width
    52. --rows, --lines <num>
    53. set screen height
    54. Show threads:
    55. H as if they were processes
    56. -L possibly with LWP and NLWP columns
    57. -m, m after processes
    58. -T possibly with SPID column
    59. Miscellaneous options:
    60. -c show scheduling class with -l option
    61. c show true command name
    62. e show the environment after command
    63. k, --sort specify sort order as: [+|-]key[,[+|-]key[,...]]
    64. L show format specifiers
    65. n display numeric uid and wchan
    66. S, --cumulative include some dead child process data
    67. -y do not show flags, show rss (only with -l)
    68. -V, V, --version display version information and exit
    69. -w, w unlimited output width
    70. --help <simple|list|output|threads|misc|all>
    71. display help and exit
    72. For more details see ps(1).
    73. [purpleendurer @ bash ~ ]

    1. [purpleendurer @ bash ~ ] ps --help a
    2. Usage:
    3. ps [options]
    4. Basic options:
    5. -A, -e all processes
    6. -a all with tty, except session leaders
    7. a all with tty, including other users
    8. -d all except session leaders
    9. -N, --deselect negate selection
    10. r only running processes
    11. T all processes on this terminal
    12. x processes without controlling ttys
    13. Selection by list:
    14. -C <command> command name
    15. -G, --Group <GID> real group id or name
    16. -g, --group <group> session or effective group name
    17. -p, p, --pid <PID> process id
    18. --ppid <PID> parent process id
    19. -q, q, --quick-pid <PID>
    20. process id (quick mode)
    21. -s, --sid <session> session id
    22. -t, t, --tty <tty> terminal
    23. -u, U, --user <UID> effective user id or name
    24. -U, --User <UID> real user id or name
    25. The selection options take as their argument either:
    26. a comma-separated list e.g. '-u root,nobody' or
    27. a blank-separated list e.g. '-p 123 4567'
    28. Output formats:
    29. -F extra full
    30. -f full-format, including command lines
    31. f, --forest ascii art process tree
    32. -H show process hierarchy
    33. -j jobs format
    34. j BSD job control format
    35. -l long format
    36. l BSD long format
    37. -M, Z add security data (for SELinux)
    38. -O <format> preloaded with default columns
    39. O <format> as -O, with BSD personality
    40. -o, o, --format <format>
    41. user-defined format
    42. s signal format
    43. u user-oriented format
    44. v virtual memory format
    45. X register format
    46. -y do not show flags, show rss vs. addr (used with -l)
    47. --context display security context (for SELinux)
    48. --headers repeat header lines, one per page
    49. --no-headers do not print header at all
    50. --cols, --columns, --width <num>
    51. set screen width
    52. --rows, --lines <num>
    53. set screen height
    54. Show threads:
    55. H as if they were processes
    56. -L possibly with LWP and NLWP columns
    57. -m, m after processes
    58. -T possibly with SPID column
    59. Miscellaneous options:
    60. -c show scheduling class with -l option
    61. c show true command name
    62. e show the environment after command
    63. k, --sort specify sort order as: [+|-]key[,[+|-]key[,...]]
    64. L show format specifiers
    65. n display numeric uid and wchan
    66. S, --cumulative include some dead child process data
    67. -y do not show flags, show rss (only with -l)
    68. -V, V, --version display version information and exit
    69. -w, w unlimited output width
    70. --help <simple|list|output|threads|misc|all>
    71. display help and exit
    72. For more details see ps(1).
    73. [purpleendurer @ bash ~ ]

    ps命令的选项分为基本选项、列表选项、输出格式选项、显示线程选项和杂项五类,如下:

    基本选项功能
    -A显示所有的进程,包括前台的、后台的、其他用户的进程,跟-e的效果相同
    -a

    显示所有终端下除了session leaders外的所有进程(ssh登录的shell是一种session leader)

    a显示所有终端主机下存在的进程,包括session leaders进程
    -d显示除了session leaders外的进程
    -e显示所有的进程,包括前台的、后台的、其他用户的进程,跟-A的效果相同

    -N

    --deselect

    否定选择
    r仅显示终端主机正在执行中的程序
    T显示当前终端主机下的所有程序
    -x显示所有程序,不以终端机来区分。通常与 a 这个参数一起使用,可列出较完整信息
    列表选项功能
    -C 显示命令名

    -G

    --Group

    显示真实的组 ID 或名称

    -g

    --group

    显示会话或有效组名称

     -p

    p

    --pid    

    显示进程ID
    --ppid   显示父进程ID

    -q

    q

    --quick-pid

    显示进程 id (快速模式)

    -s

    --sid

    显示会话ID

    -t

    t

    --tty

    显示终端

    -u []

    u

    --user

    显示指定UID的有效用户的进程状态,未指定UID则显示当前用户的进程状态

    -U   

    --User  

    显示指定UID的真实用户的进程状态
    输出格式选项功能
         --context显示安全上下文(用于 SELinux)

    --cols 

    --columns 

    设置屏幕宽度
    -F
    -f把进程的所有信息都显示出来,包括命令行

    f

    --forest

    用ASCII字符显示树状结构
    --format 用户定义的格式
     -H显示进程层次结构
    --headers重复标题行,每页一行
     -j作业格式
    jBSD 作业控制格式
    -l较长、较详细的格式
    lBSD的长格式
     --lines 设置屏幕高度
     -M添加安全数据(适用于 SELinux)
    --no-headers不打印标题
     -O  预加载默认列
    O 与-O相似,但是具有BSD

    -o 

    o                  

    与--format 相同,用户定义的格式
    --rows 设置屏幕高度
      s信号格式
      u面向用户的格式
      v虚拟内存格式
    --width 设置屏幕宽度
      X寄存器格式
     -y不显示标志,显示 RSS 与 ADDR(与 -l 一起使用)
    显示线程选项功能
      H             就好像它们是过程一样
    -L可能带有 LWP 和 NLWP 列

    -m

    m

    处理后
    -T可能与 SPID 列
    杂项功能
    -c显示调度类(与-l 选项使用)
    --cumulative 包括一些死亡子进程数据
    c显示真命令名
    e命令后显示环境
    --help
                         
    显示帮助和退出
    k将排序顺序指定为: [ + |-] key [ ,[ + |-] key [ ,... ]]
    L显示格式说明符
    n显示数字 uid 和 wchan
    S 包括一些死亡子进程数据,与 --cumulative 相同
    --sort将排序顺序指定为: [ + |-] key [ ,[ + |-] key [ ,... ]]
    -y不显示标志,显示 rss (只与-l配合使用)

    -V

    V

    --version

    显示版本信息并退出

    -w

    w

    无限输出宽度

    2.进程的PID、PPID,PGID和SID

    在Linux中,每个进程都有多个与之关联的 ID,包括:

    2.1 进程 ID (Process ID,PID)

    这是标识进程的任意数字。每个进程都有一个唯一的 ID,但在进程退出并且父进程检索到退出状态后,该进程 ID 将被释放以供新进程重用。

    2.2 父进程 ID (Parent Process ID ,PPID)

    这只是启动相关进程的进程的 PID。如果父进程在子进程之前退出,则子进程的 PPID 将更改为另一个进程(通常为 PID 1)。

    2.3 进程组 ID (Process Group ID,PGID)

    进程组领导者的 PID。如果 PID == PGID,则此进程是进程组的领导者。

    2.4 会话 ID (Session ID,SID)

    这只是会话领导者的 PID。如果 PID == SID,则此进程是会话领导者。

    会话和进程组只是将许多相关进程视为一个单元的方法。进程组的所有成员始终属于同一会话,但一个进程可能具有多个进程组。

    通常,一个 shell 就是一个会话领导者,该 shell 执行的每个命令进程都将是一个进程组。这是为了在shell退出时很容易杀死shell的子进程。

    3 Linux进程的状态

    linux中进程有以下几种状态:

    1. R——Runnable(运行):正在运行或在运行队列中等待。只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。
    2. S——sleeping(中断):休眠中,受阻,在等待某个条件的形成或接收到信号。处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。
    3. D——uninterruptible sleep(不可中断):收到信号不唤醒和不可运行,进程必须等待直到有中断发生。与TASK_INTERRUPTIBLE状态类似,进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。绝大多数情况下,进程处在睡眠状态时,总是应该能够响应异步信号的。
    4. Z——zombie(僵死):进程已终止,但进程描述还在,直到父进程调用wait4()系统调用后释放。这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。于是进程就只剩下task_struct这么个空壳,故称为僵尸。之所以保留task_struct,是因为task_struct里面保存了进程的退出码、以及一些统计信息。而其父进程很可能会关心这些信息。比如在shell中,$?变量就保存了最后一个退出的前台进程的退出码,而这个退出码往往被作为if语句的判断条件。
    5. T——traced or stoppd(停止):进程收到SiGSTOP,SIGSTP,SIGTOU信号后停止运行。对于进程本身来说,TASK_STOPPED和TASK_TRACED状态很类似,都是表示进程暂停下来。
      而TASK_TRACED状态相当于在TASK_STOPPED之上多了一层保护,处于TASK_TRACED状态的进程不能响应SIGCONT信号而被唤醒。只能等到调试进程通过ptrace系统调用执行PTRACE_CONT、PTRACE_DETACH等操作(通过ptrace系统调用的参数指定操作),或调试进程退出,被调试的进程才能恢复TASK_RUNNING状态。
    6. W: 进入内存交换(从内核2.6开始无效)
    7. X——TASK_DEAD – EXIT_DEAD(死亡的任务-退出死亡):退出状态,进程即将被销毁。进程将被置于EXIT_DEAD退出状态,这意味着接下来的代码立即就会将该进程彻底释放。所以EXIT_DEAD状态是非常短暂的,几乎不可能通过ps命令捕捉到。
    8. <:   高优先级
    9. N:  低优先级
    10. L:  有些页被锁进内存
    11. s:   包含子进程
    12. \+: 位于后台的进程组
    13. l   : 多线程,克隆线程

    4 ps 命令实例

    4.1  ps -A

    1. [purpleendurer @ bash ~] ps -A
    2. PID TTY TIME CMD
    3. 1 pts/0 00:00:00 zsh
    4. 47 pts/1 00:00:00 zsh
    5. 72 pts/2 00:00:00 zsh
    6. 100 pts/1 00:00:00 bash
    7. 115 pts/3 00:00:00 zsh
    8. 142 pts/4 00:00:00 zsh
    9. 169 pts/5 00:00:00 zsh
    10. 194 pts/6 00:00:00 zsh
    11. 222 pts/6 00:00:00 bash
    12. 237 pts/6 00:00:00 ps
    13. [purpleendurer @ bash ~]

    命令列出了10条进程信息 

    包括4列内容,其中:

    1. PID:进程ID
    2. TTY:与进程关联的终端,涵盖pts/0~pts/6。如果是?,就是与终端无关的进程,即后台服务,意味着它不依赖于终端。
    3. TIME:进程从触发开始所运行的时间
    4. CMD:启动进程的命令

    4.2 ps -a

    1. [purpleendurer @ bash ~] ps -a
    2. PID TTY TIME CMD
    3. 100 pts/1 00:00:00 bash
    4. 222 pts/6 00:00:00 bash
    5. 238 pts/6 00:00:00 ps
    6. [purpleendurer @ bash ~]

    与2.1相比,命令列只出了3个进程,TTY分别为pts/1、pts/6。

    4.3 ps a

    1. [purpleendurer @ bash ~] ps a
    2. PID TTY STAT TIME COMMAND
    3. 1 pts/0 Ss+ 0:00 /bin/zsh
    4. 47 pts/1 Ss 0:00 /bin/zsh
    5. 72 pts/2 Ss+ 0:00 /bin/zsh
    6. 100 pts/1 S+ 0:00 bash
    7. 115 pts/3 Ss+ 0:00 /bin/zsh
    8. 142 pts/4 Ss+ 0:00 /bin/zsh
    9. 169 pts/5 Ss+ 0:00 /bin/zsh
    10. 194 pts/6 Ss 0:00 /bin/zsh
    11. 222 pts/6 S 0:00 bash
    12. 239 pts/6 R+ 0:00 ps a
    13. [purpleendurer @ bash ~]

    命令列出了10个进程 ,数量与 2.1相同,比2.2 不仅多了7个进程信息,包括了TTY值为pts/0、pts/2、pts/3、pts/4和pts/5的进程信息,而且在信息项数量上,也多了1列,即:

    STAT(即:状态)。

    4.4 ps -d

    1. [purpleendurer @ bash ~ ]ps -d
    2. PID TTY TIME CMD
    3. 102 pts/1 00:00:00 bash
    4. 115 pts/1 00:00:00 ps
    5. [purpleendurer @ bash ~ ]ps -a
    6. PID TTY TIME CMD
    7. 102 pts/1 00:00:00 bash
    8. 116 pts/1 00:00:00 ps
    9. [purpleendurer @ bash ~ ]

     

    从命令返回信息来看,-d 和 -a选项还是有一些差别的。

    4.5 ps -f

    1. [purpleendurer @ bash ~ ]ps -f
    2. UID PID PPID C STIME TTY TIME CMD
    3. csdn 47 0 0 23:24 pts/1 00:00:00 /bin/zsh
    4. csdn 106 47 0 23:24 pts/1 00:00:00 bash
    5. csdn 120 106 0 23:24 pts/1 00:00:00 ps -f
    6. [purpleendurer @ bash ~ ]

    返回的信息中有8列,其中多出的3列是:

    1. PPID  :父进程ID
    2. C        : CPU?
    3. STIME:进程触发的时间

     通过对比PID和PPID,我们可以看出进程之间的父子衍生关系。

    2.5 ps -F

    1. [purpleendurer @ bash ~ ]ps -F
    2. UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
    3. csdn 47 0 0 10039 5044 0 23:24 pts/1 00:00:00 /bin/zsh
    4. csdn 106 47 0 3781 3488 0 23:24 pts/1 00:00:00 bash
    5. csdn 119 106 0 13763 3808 0 23:24 pts/1 00:00:00 ps -F

    返回信息包括11列,比 2.4 多了3列:

    1. SZ  :进程核心映像的页面大小
    2. RSS:驻留空间的大小。显示当前常驻内存的程序的K字节数。
    3. PSR:绑定内核线程的处理器(如果有)的逻辑处理器号

    4.6 ps -aux

    1. [purpleendurer @ bash ~ ]ps -aux
    2. USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    3. csdn 1 0.0 0.1 40356 5140 pts/0 Ss+ 00:02 0:00 /bin/zsh
    4. csdn 46 0.0 0.1 40156 4956 pts/1 Ss+ 00:02 0:00 /bin/zsh
    5. csdn 70 0.0 0.1 40156 5024 pts/2 Ss+ 00:02 0:00 /bin/zsh
    6. csdn 98 0.0 0.1 40156 4888 pts/3 Ss+ 00:13 0:00 /bin/zsh
    7. csdn 123 0.0 0.1 40156 5016 pts/4 Ss+ 00:13 0:00 /bin/zsh
    8. csdn 152 0.0 0.1 40156 5044 pts/5 Ss 00:24 0:00 /bin/zsh
    9. csdn 177 0.0 0.1 40156 4944 pts/6 Ss+ 00:24 0:00 /bin/zsh
    10. csdn 205 0.0 0.0 15124 3404 pts/5 S 00:24 0:00 bash
    11. csdn 219 0.0 0.1 55052 3912 pts/5 R+ 00:26 0:00 ps -aux
    12. [purpleendurer @ bash ~ ]

     

     返回的信息共有11列,其中:
     

    1. %CPU :      进程的cpu占用率
    2. %MEM:       进程使用内存的百分比
    3. VSZ     :       进程使用的虚拟内存大小,以K为单位

    4.7 ps -ef

    1. [purpleendurer @ bash ~ ]ps -ef
    2. UID PID PPID C STIME TTY TIME CMD
    3. csdn 1 0 0 00:02 pts/0 00:00:00 /bin/zsh
    4. csdn 46 0 0 00:02 pts/1 00:00:00 /bin/zsh
    5. csdn 70 0 0 00:02 pts/2 00:00:00 /bin/zsh
    6. csdn 98 0 0 00:13 pts/3 00:00:00 /bin/zsh
    7. csdn 123 0 0 00:13 pts/4 00:00:00 /bin/zsh
    8. csdn 152 0 0 00:24 pts/5 00:00:00 /bin/zsh
    9. csdn 177 0 0 00:24 pts/6 00:00:00 /bin/zsh
    10. csdn 205 152 0 00:24 pts/5 00:00:00 bash
    11. csdn 218 205 0 00:24 pts/5 00:00:00 ps -ef
    12. [purpleendurer @ bash ~ ]

  • 相关阅读:
    python计算脚长 青少年电子学会等级考试 中小学生python编程等级考试一级真题答案解析2022年9月
    redis分布式锁的实现
    企业跨境出海选择AWS怎么样?
    html网页制作期末大作业-网上花店商城html+css+javascript
    软件确认测试有什么作用?确认测试报告的价格是多少?
    死锁详细解读
    AVL树的插入(C++实现)
    Linux基本指令集合
    【Windows编程】windows窗口创建过程详解
    【代码随想录算法训练营】第48天 | 第九章 动态规划(九)+ 复习第20天 第六章 二叉树(四)
  • 原文地址:https://blog.csdn.net/Purpleendurer/article/details/139696466