0 前言
系统进程信息是电脑网络信息安全检查中的一块重要内容,对于使用Linux和基于Linux作为操作系统的电脑来说,可以使用ps命令。
1 ps命令 的功能、格式和选项说明
1.1 ps命令 的功能
Linux 中的ps(意为:process status)命令用于显示当前进程的状态,类似于Windows系统中的tasklist 命令,我们可以查看系统中运行的进程信息,包括进程的ID、父进程ID、CPU和内存占用等信息,并可以根据需求进行进一步的过滤和排序。
我们可以使用命令 ps --help 来查看ps命令的帮助信息。
[purpleendurer @ bash ~ ] ps --helpUsage:ps [options]Try 'ps --help <simple|list|output|threads|misc|all>'or 'ps --help <s|l|o|t|m|a>'for additional help text.For more details see ps(1).
[purpleendurer @ bash ~ ]
1.2 ps命令的格式
ps [选项]
1.3 ps命令的选项
ps命令的选项非常多。
[purpleendurer @ bash ~ ] ps --help simpleUsage:ps [options]Basic options:-A, -e all processes-a all with tty, except session leadersa all with tty, including other users-d all except session leaders-N, --deselect negate selectionr only running processesT all processes on this terminalx processes without controlling ttysFor more details see ps(1).
[purpleendurer @ bash ~ ] ps --help listUsage:ps [options]Selection by list:-C <command> command name-G, --Group <GID> real group id or name-g, --group <group> session or effective group name-p, p, --pid <PID> process id--ppid <PID> parent process id-q, q, --quick-pid <PID>process id (quick mode)-s, --sid <session> session id-t, t, --tty <tty> terminal-u, U, --user <UID> effective user id or name-U, --User <UID> real user id or nameThe selection options take as their argument either:a comma-separated list e.g. '-u root,nobody' ora blank-separated list e.g. '-p 123 4567'For more details see ps(1).
[purpleendurer @ bash ~ ]
[purpleendurer @ bash ~ ] ps --help outputUsage:ps [options]Output formats:-F extra full-f full-format, including command linesf, --forest ascii art process tree-H show process hierarchy-j jobs formatj BSD job control format-l long formatl BSD long format-M, Z add security data (for SELinux)-O <format> preloaded with default columnsO <format> as -O, with BSD personality-o, o, --format <format>user-defined formats signal formatu user-oriented formatv virtual memory formatX register format-y do not show flags, show rss vs. addr (used with -l)--context display security context (for SELinux)--headers repeat header lines, one per page--no-headers do not print header at all--cols, --columns, --width <num>set screen width--rows, --lines <num>set screen heightFor more details see ps(1).
[purpleendurer @ bash ~ ]
[purpleendurer @ bash ~ ] ps --help threadsUsage:ps [options]Show threads:H as if they were processes-L possibly with LWP and NLWP columns-m, m after processes-T possibly with SPID columnFor more details see ps(1).
[purpleendurer @ bash ~ ]
[purpleendurer @ bash ~ ] ps --help miscUsage:ps [options]Miscellaneous options:-c show scheduling class with -l optionc show true command namee show the environment after commandk, --sort specify sort order as: [+|-]key[,[+|-]key[,...]]L show format specifiersn display numeric uid and wchanS, --cumulative include some dead child process data-y do not show flags, show rss (only with -l)-V, V, --version display version information and exit-w, w unlimited output width--help <simple|list|output|threads|misc|all>display help and exitFor more details see ps(1).
[purpleendurer @ bash ~ ]
[purpleendurer @ bash ~ ] ps --help allUsage:ps [options]Basic options:-A, -e all processes-a all with tty, except session leadersa all with tty, including other users-d all except session leaders-N, --deselect negate selectionr only running processesT all processes on this terminalx processes without controlling ttysSelection by list:-C <command> command name-G, --Group <GID> real group id or name-g, --group <group> session or effective group name-p, p, --pid <PID> process id--ppid <PID> parent process id-q, q, --quick-pid <PID>process id (quick mode)-s, --sid <session> session id-t, t, --tty <tty> terminal-u, U, --user <UID> effective user id or name-U, --User <UID> real user id or nameThe selection options take as their argument either:a comma-separated list e.g. '-u root,nobody' ora blank-separated list e.g. '-p 123 4567'Output formats:-F extra full-f full-format, including command linesf, --forest ascii art process tree-H show process hierarchy-j jobs formatj BSD job control format-l long formatl BSD long format-M, Z add security data (for SELinux)-O <format> preloaded with default columnsO <format> as -O, with BSD personality-o, o, --format <format>user-defined formats signal formatu user-oriented formatv virtual memory formatX register format-y do not show flags, show rss vs. addr (used with -l)--context display security context (for SELinux)--headers repeat header lines, one per page--no-headers do not print header at all--cols, --columns, --width <num>set screen width--rows, --lines <num>set screen heightShow threads:H as if they were processes-L possibly with LWP and NLWP columns-m, m after processes-T possibly with SPID columnMiscellaneous options:-c show scheduling class with -l optionc show true command namee show the environment after commandk, --sort specify sort order as: [+|-]key[,[+|-]key[,...]]L show format specifiersn display numeric uid and wchanS, --cumulative include some dead child process data-y do not show flags, show rss (only with -l)-V, V, --version display version information and exit-w, w unlimited output width--help <simple|list|output|threads|misc|all>display help and exitFor more details see ps(1).
[purpleendurer @ bash ~ ]
[purpleendurer @ bash ~ ] ps --help aUsage:ps [options]Basic options:-A, -e all processes-a all with tty, except session leadersa all with tty, including other users-d all except session leaders-N, --deselect negate selectionr only running processesT all processes on this terminalx processes without controlling ttysSelection by list:-C <command> command name-G, --Group <GID> real group id or name-g, --group <group> session or effective group name-p, p, --pid <PID> process id--ppid <PID> parent process id-q, q, --quick-pid <PID>process id (quick mode)-s, --sid <session> session id-t, t, --tty <tty> terminal-u, U, --user <UID> effective user id or name-U, --User <UID> real user id or nameThe selection options take as their argument either:a comma-separated list e.g. '-u root,nobody' ora blank-separated list e.g. '-p 123 4567'Output formats:-F extra full-f full-format, including command linesf, --forest ascii art process tree-H show process hierarchy-j jobs formatj BSD job control format-l long formatl BSD long format-M, Z add security data (for SELinux)-O <format> preloaded with default columnsO <format> as -O, with BSD personality-o, o, --format <format>user-defined formats signal formatu user-oriented formatv virtual memory formatX register format-y do not show flags, show rss vs. addr (used with -l)--context display security context (for SELinux)--headers repeat header lines, one per page--no-headers do not print header at all--cols, --columns, --width <num>set screen width--rows, --lines <num>set screen heightShow threads:H as if they were processes-L possibly with LWP and NLWP columns-m, m after processes-T possibly with SPID columnMiscellaneous options:-c show scheduling class with -l optionc show true command namee show the environment after commandk, --sort specify sort order as: [+|-]key[,[+|-]key[,...]]L show format specifiersn display numeric uid and wchanS, --cumulative include some dead child process data-y do not show flags, show rss (only with -l)-V, V, --version display version information and exit-w, w unlimited output width--help <simple|list|output|threads|misc|all>display help and exitFor more details see ps(1).
[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 <command> | 显示命令名 |
-G --Group <GID> | 显示真实的组 ID 或名称 |
-g --group <group> | 显示会话或有效组名称 |
-p p --pid <PID> | 显示进程ID |
--ppid <PID> | 显示父进程ID |
-q q --quick-pid <PID> | 显示进程 id (快速模式) |
-s --sid <session> | 显示会话ID |
-t t --tty <tty> | 显示终端 |
-u [<UID>] u <UID> --user <UID> | 显示指定UID的有效用户的进程状态,未指定UID则显示当前用户的进程状态 |
-U <UID> --User <UID> | 显示指定UID的真实用户的进程状态 |
输出格式选项 | 功能 |
--context | 显示安全上下文(用于 SELinux) |
--cols <num> --columns <num> | 设置屏幕宽度 |
-F | |
-f | 把进程的所有信息都显示出来,包括命令行 |
f --forest | 用ASCII字符显示树状结构 |
--format <format> | 用户定义的格式 |
-H | 显示进程层次结构 |
--headers | 重复标题行,每页一行 |
-j | 作业格式 |
j | BSD 作业控制格式 |
-l | 较长、较详细的格式 |
l | BSD的长格式 |
--lines <num> | 设置屏幕高度 |
-M | 添加安全数据(适用于 SELinux) |
--no-headers | 不打印标题 |
-O <format> | 预加载默认列 |
O <format> | 与-O相似,但是具有BSD |
-o <format> o <format> | 与--format 相同,用户定义的格式 |
--rows <num> | 设置屏幕高度 |
s | 信号格式 |
u | 面向用户的格式 |
v | 虚拟内存格式 |
--width <num> | 设置屏幕宽度 |
X | 寄存器格式 |
-y | 不显示标志,显示 RSS 与 ADDR(与 -l 一起使用) |
显示线程选项 | 功能 |
H | 就好像它们是过程一样 |
-L | 可能带有 LWP 和 NLWP 列 |
-m m | 处理后 |
-T | 可能与 SPID 列 |
杂项 | 功能 |
-c | 显示调度类(与-l 选项使用) |
--cumulative | 包括一些死亡子进程数据 |
c | 显示真命令名 |
e | 命令后显示环境 |
--help <simple|list|output|threads|misc|all> | 显示帮助和退出 |
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中进程有以下几种状态:
- R——Runnable(运行):正在运行或在运行队列中等待。只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。
- S——sleeping(中断):休眠中,受阻,在等待某个条件的形成或接收到信号。处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。
- D——uninterruptible sleep(不可中断):收到信号不唤醒和不可运行,进程必须等待直到有中断发生。与TASK_INTERRUPTIBLE状态类似,进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。绝大多数情况下,进程处在睡眠状态时,总是应该能够响应异步信号的。
- Z——zombie(僵死):进程已终止,但进程描述还在,直到父进程调用wait4()系统调用后释放。这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。于是进程就只剩下task_struct这么个空壳,故称为僵尸。之所以保留task_struct,是因为task_struct里面保存了进程的退出码、以及一些统计信息。而其父进程很可能会关心这些信息。比如在shell中,$?变量就保存了最后一个退出的前台进程的退出码,而这个退出码往往被作为if语句的判断条件。
- 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状态。- W: 进入内存交换(从内核2.6开始无效)
- X——TASK_DEAD – EXIT_DEAD(死亡的任务-退出死亡):退出状态,进程即将被销毁。进程将被置于EXIT_DEAD退出状态,这意味着接下来的代码立即就会将该进程彻底释放。所以EXIT_DEAD状态是非常短暂的,几乎不可能通过ps命令捕捉到。
- <: 高优先级
- N: 低优先级
- L: 有些页被锁进内存
- s: 包含子进程
- \+: 位于后台的进程组
- l : 多线程,克隆线程
4 ps 命令实例
4.1 ps -A
[purpleendurer @ bash ~] ps -APID TTY TIME CMD1 pts/0 00:00:00 zsh47 pts/1 00:00:00 zsh72 pts/2 00:00:00 zsh100 pts/1 00:00:00 bash115 pts/3 00:00:00 zsh142 pts/4 00:00:00 zsh169 pts/5 00:00:00 zsh194 pts/6 00:00:00 zsh222 pts/6 00:00:00 bash237 pts/6 00:00:00 ps
[purpleendurer @ bash ~]
命令列出了10条进程信息
包括4列内容,其中:
- PID:进程ID
- TTY:与进程关联的终端,涵盖pts/0~pts/6。如果是?,就是与终端无关的进程,即后台服务,意味着它不依赖于终端。
- TIME:进程从触发开始所运行的时间
- CMD:启动进程的命令
4.2 ps -a
[purpleendurer @ bash ~] ps -aPID TTY TIME CMD100 pts/1 00:00:00 bash222 pts/6 00:00:00 bash238 pts/6 00:00:00 ps
[purpleendurer @ bash ~]
与2.1相比,命令列只出了3个进程,TTY分别为pts/1、pts/6。
4.3 ps a
[purpleendurer @ bash ~] ps aPID TTY STAT TIME COMMAND1 pts/0 Ss+ 0:00 /bin/zsh47 pts/1 Ss 0:00 /bin/zsh72 pts/2 Ss+ 0:00 /bin/zsh100 pts/1 S+ 0:00 bash115 pts/3 Ss+ 0:00 /bin/zsh142 pts/4 Ss+ 0:00 /bin/zsh169 pts/5 Ss+ 0:00 /bin/zsh194 pts/6 Ss 0:00 /bin/zsh222 pts/6 S 0:00 bash239 pts/6 R+ 0:00 ps a
[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
[purpleendurer @ bash ~ ]ps -dPID TTY TIME CMD102 pts/1 00:00:00 bash115 pts/1 00:00:00 ps
[purpleendurer @ bash ~ ]ps -aPID TTY TIME CMD102 pts/1 00:00:00 bash116 pts/1 00:00:00 ps
[purpleendurer @ bash ~ ]
从命令返回信息来看,-d 和 -a选项还是有一些差别的。
4.5 ps -f
[purpleendurer @ bash ~ ]ps -f
UID PID PPID C STIME TTY TIME CMD
csdn 47 0 0 23:24 pts/1 00:00:00 /bin/zsh
csdn 106 47 0 23:24 pts/1 00:00:00 bash
csdn 120 106 0 23:24 pts/1 00:00:00 ps -f
[purpleendurer @ bash ~ ]
返回的信息中有8列,其中多出的3列是:
- PPID :父进程ID
- C : CPU?
- STIME:进程触发的时间
通过对比PID和PPID,我们可以看出进程之间的父子衍生关系。
2.5 ps -F
[purpleendurer @ bash ~ ]ps -F
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
csdn 47 0 0 10039 5044 0 23:24 pts/1 00:00:00 /bin/zsh
csdn 106 47 0 3781 3488 0 23:24 pts/1 00:00:00 bash
csdn 119 106 0 13763 3808 0 23:24 pts/1 00:00:00 ps -F
返回信息包括11列,比 2.4 多了3列:
- SZ :进程核心映像的页面大小
- RSS:驻留空间的大小。显示当前常驻内存的程序的K字节数。
- PSR:绑定内核线程的处理器(如果有)的逻辑处理器号
4.6 ps -aux
[purpleendurer @ bash ~ ]ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
csdn 1 0.0 0.1 40356 5140 pts/0 Ss+ 00:02 0:00 /bin/zsh
csdn 46 0.0 0.1 40156 4956 pts/1 Ss+ 00:02 0:00 /bin/zsh
csdn 70 0.0 0.1 40156 5024 pts/2 Ss+ 00:02 0:00 /bin/zsh
csdn 98 0.0 0.1 40156 4888 pts/3 Ss+ 00:13 0:00 /bin/zsh
csdn 123 0.0 0.1 40156 5016 pts/4 Ss+ 00:13 0:00 /bin/zsh
csdn 152 0.0 0.1 40156 5044 pts/5 Ss 00:24 0:00 /bin/zsh
csdn 177 0.0 0.1 40156 4944 pts/6 Ss+ 00:24 0:00 /bin/zsh
csdn 205 0.0 0.0 15124 3404 pts/5 S 00:24 0:00 bash
csdn 219 0.0 0.1 55052 3912 pts/5 R+ 00:26 0:00 ps -aux
[purpleendurer @ bash ~ ]
返回的信息共有11列,其中:
- %CPU : 进程的cpu占用率
- %MEM: 进程使用内存的百分比
- VSZ : 进程使用的虚拟内存大小,以K为单位
4.7 ps -ef
[purpleendurer @ bash ~ ]ps -ef
UID PID PPID C STIME TTY TIME CMD
csdn 1 0 0 00:02 pts/0 00:00:00 /bin/zsh
csdn 46 0 0 00:02 pts/1 00:00:00 /bin/zsh
csdn 70 0 0 00:02 pts/2 00:00:00 /bin/zsh
csdn 98 0 0 00:13 pts/3 00:00:00 /bin/zsh
csdn 123 0 0 00:13 pts/4 00:00:00 /bin/zsh
csdn 152 0 0 00:24 pts/5 00:00:00 /bin/zsh
csdn 177 0 0 00:24 pts/6 00:00:00 /bin/zsh
csdn 205 152 0 00:24 pts/5 00:00:00 bash
csdn 218 205 0 00:24 pts/5 00:00:00 ps -ef
[purpleendurer @ bash ~ ]