今天我们开始学习Linux系统进程管理
是一组指令及参数的集合,按照既定的逻辑控制计算机运行用来完成特定任务,是静态的;:是运行着的程序,是操作系统执行的基本单位,是程序运行的过程, 是动态的,是有生命周期及运行状态的。是操作系统分配内存、CPU时间片等资源的基本单位。:是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
一、Linux程序与进程
1、程序,进程,线程的概念
-
程序:是一组指令及参数的集合,按照既定的逻辑控制计算机运行用来完成特定任务,是静态的;
-
进程:是运行着的程序,是操作系统执行的基本单位,是程序运行的过程, 是动态的,是有生命周期及运行状态的。是操作系统分配内存、CPU时间片等资源的基本单位。
-
线程:是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
2、程序和进程的区别
-
程序是静态的,它只是一组指令的集合,不具有任何的运行意义。而进程是程序运行的动态过程;
-
进程和程序并不是一一对应的关系,相同的程序运行在不同的数据集上就是不同的进程;
-
进程还具有并发性和交往性,而程序却是封闭的。
3、进程和线程的区别
-
一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发拥有多个线程,而一个线程同时只能被一个进程所拥有;
-
线程不能单独执行,但是每一个线程都有程序的入口、执行序列以及程序出口,它必须组成进程才能被执行。
二、Linux进程基础(生命周期)
1、进程生命周期
-
父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID(PID),PID和父进程ID(PPID)是子进程环境的元素,任何进程都可以创建子进程。
-
所有进程都是第一个系统进程的后代:在centos6中,第一个系统进程是init,而在centos7中,第一个系统进程是systemd。
2、父子进程的关系
-
子进程由父进程产生,在linux系统中,使用系统调用fork创建进程。fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境。子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。
-
运行过程:子进程运行时父进程休眠。当子进程完成时发出(exit)信号请求,在退出时,子进程已经关闭或丢弃了其资源环境后,剩余释放不掉的资源称之为僵尸进程。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。
-
进程查看命令
1、pstree
用于查看进程树之间的关系,谁是父进程,谁是子进程,可以清楚的看出来是谁创建了谁
下面是一个激活父子进程树状图的命令,有些系统可能没有自动激活该进程。
yum install -y psmisc
用法:
pstree [选项]
选项:
| -A | 各进程树之间的连接以ASCII码字符来连接 |
|---|---|
| -U | :各进程树之间的连接以utf8字符来连接,某些终端可能会有错误 |
| -p | 同时列出每个进程的PID |
| -u | 同时列出每个进程的所属账号名称 |
[root@localhost nginx-1.29.1]# pstree
systemd─┬─NetworkManager─┬─dhclient
│ └─2*[{NetworkManager}]
├─VGAuthService
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon
├─irqbalance
├─login───bash
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─nginx───nginx
├─polkitd───6*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd─┬─bash───pstree
│ └─bash───top
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───2*[{vmtoolsd}]
2、ps
显示系统当前进程瞬间运行状态
用法:
ps [选项]
选项:
| -A | 所有的进程均显示出来,与 -e 具有同样的效用 |
|---|---|
| -a | 显示现行终端机下的所有进程,包括其他用户的进程 |
| -u | 以用户为主的进程状态 |
| -x | 通常与 a 这个参数一起使用,可列出较完整信息 |
| -l | 较长、较详细的将该PID 的的信息列出 |
[root@localhost ~]# ps -A
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 kthreadd
4 ? 00:00:00 kworker/0:0H
6 ? 00:00:00 ksoftirqd/0
7 ? 00:00:00 migration/0
8 ? 00:00:00 rcu_bh
9 ? 00:00:00 rcu_sched
10 ? 00:00:00 lru-add-drain
查看nginx程序的进程
[root@localhost conf]# ps aux | grep [n]ginx
root 8484 0.0 0.0 20596 612 ? Ss 19:10 0:00 nginx: master process nginx
nobody 8485 0.0 0.0 21040 1312 ? S 19:10 0:00 nginx: worker process
进程状态:
S:休眠
s:父进程
R:运行
Z:僵尸进程(前台程序已死,但后台驻留进程没有正常退出;后果就是占用资源不干活。)
在Linux中,使用 ps aux 命令可以查看当前运行的进程及其详细信息。输出的每一列代表不同的信息,其中 STAT(或 S)列表示进程的状态(Process State),即进程的类型或当前行为。
ps aux 输出的进程状态(STAT)详解
ps aux 的典型输出如下:
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.1 190932 3940 ? Ss 18:06 0:01 /usr
root 2 0.0 0.0 0 0 ? S 18:06 0:00 [kth
root 4 0.0 0.0 0 0 ? S< 18:06 0:00 [kwo
root 549 0.0 0.0 0 0 ? S 18:07 0:00 [kwo
root 602 0.0 0.1 39056 2876 ? Ss 18:07 0:00 /usr
root 625 0.0 0.1 190376 3416 ? Ss 18:07 0:00 /usr
root 634 0.0 0.0 0 0 ? S 18:07 0:00 [kwo
root 636 0.1 0.0 45456 1916 ? Ss 18:07 0:01 /usr
root 779 0.0 0.0 55532 856 ? S<sl 18:07 0:00 /sbi
dbus 802 0.0 0.1 58216 2492 ? Ss 18:07 0:00 /usr
root 804 0.0 0.5 626428 11260 ? Ssl 18:07 0:00 /usr
root 805 0.0 0.2 168304 5180 ? Ss 18:07 0:00 /usr
root 806 0.1 0.2 273164 4872 ? Ssl 18:07 0:01 /usr
root 808 0.0 0.0 26424 1788 ? Ss 18:07 0:00 /usr
polkitd 809 0.0 0.6 612332 12276 ? Ssl 18:07 0:00 /usr
root 810 0.0 0.0 21688 1332 ? Ss 18:07 0:00 /usr
root 825 0.0 0.0 126388 1632 ? Ss 18:07 0:00 /usr
chrony 831 0.0 0.0 117808 1736 ? S 18:07 0:00 /usr
root 845 0.0 0.1 99288 2800 ? Ss 18:07 0:00 logi
root 908 0.0 0.2 102904 5504 ? S 18:07 0:00 /sbi
root 1115 0.0 0.9 574280 19472 ? Ssl 18:07 0:00 /usr
root 1117 0.0 0.2 218528 4204 ? Ssl 18:07 0:00 /usr
root 1233 0.0 0.1 89708 2128 ? Ss 18:07 0:00 /usr
postfix 1238 0.0 0.2 89812 4088 ? S 18:07 0:00 pick
postfix 1239 0.0 0.2 89880 4104 ? S 18:07 0:00 qmgr
root 1367 0.0 0.0 0 0 ? S< 18:07 0:00 [kwo
root 1371 0.0 0.1 115540 2092 tty1 Ss+ 18:07 0:00 -bas
root 1388 0.0 0.0 0 0 ? S< 18:07 0:00 [kwo
root 1401 0.0 0.2 112900 4312 ? Ss 18:09 0:00 /usr
root 1408 0.0 0.3 159376 6244 ? Ds 18:11 0:00 sshd
root 1410 0.0 0.1 115544 2048 pts/0 Ss 18:11 0:00 -bas
root 1714 0.0 0.0 0 0 ? S 18:17 0:00 [kwo
root 2007 0.0 0.0 0 0 ? R 18:22 0:00 [kwo
root 2250 0.0 0.0 155448 1876 pts/0 R+ 18:27 0:00 ps a
输出解析:
-
USER:进程的所有者。 -
PID:进程的 ID。 -
%CPU:进程占用的 CPU 百分比。 -
%MEM:进程占用的内存百分比。 -
VSZ:进程使用的虚拟内存大小。 -
RSS:进程使用的物理内存大小。 -
TTY:进程所在的终端。 -
STAT:进程的状态,如S(休眠)、R(运行)、Z(僵尸进程)等。 -
START:进程的启动时间。 -
TIME:进程启动耗时时间。 -
COMMAND:启动进程的命令。
其中 STAT 列 的字母组合表示进程的状态,常见的有:
| 状态码 | 含义 | 说明 |
|---|---|---|
R |
Running (运行中) | 进程正在运行或可运行(在运行队列中)。 |
S |
Interruptible Sleep (可中断睡眠) | 进程在等待事件(如I/O、信号),可被信号唤醒。 |
D |
Uninterruptible Sleep (不可中断睡眠) | 进程在等待硬件I/O(如磁盘读写),不能被信号唤醒,通常与内核相关。 |
T |
Stopped (已停止) | 进程被信号(如 SIGSTOP)暂停,或正在被调试(gdb)。 |
Z |
Zombie (僵尸进程) | 进程已终止,但父进程尚未调用 wait() 回收资源。 |
| `X`` | Dead (已死亡) | 进程已完全终止(极少见到)。 |
I |
Idle (空闲) | 内核线程,处于空闲状态(较新内核使用)。 |
< |
High Priority (高优先级) | 进程优先级较高(nice 值为负)。 |
N |
Low Priority (低优先级) | 进程优先级较低(nice 值为正)。 |
s |
Session Leader (会话领导者) | 进程是会话(Session)的首进程(如 bash)。 |
l |
Multi-threaded (多线程) | 进程是多线程的(如 nginx)。 |
+ |
Foreground (前台进程) | 进程属于前台进程组(如终端运行的命令)。 |
常见进程状态组合
-
Ss:会话领导者(s),处于可中断睡眠(S),如bash终端进程。 -
Ssl:多线程(l)的会话领导者(s),如systemd。 -
R+:前台运行(+)的进程(R),如top命令。 -
D:不可中断睡眠(D),常见于磁盘I/O密集型任务(如dd命令)。 -
Z:僵尸进程(Z),需要父进程回收资源。 -
I<:内核空闲线程(I),低优先级(<)。
ps -efj 显示进程父子关系
[root@localhost ~]# ps -efj
UID PID PPID PGID SID C STIME TTY TIME CMD
root 1 0 1 1 0 18:06 ? 00:00:01 /usr/lib/sys
root 2 0 0 0 0 18:06 ? 00:00:00 [kthreadd]
root 4 2 0 0 0 18:06 ? 00:00:00 [kworker/0:0
root 6 2 0 0 0 18:06 ? 00:00:00 [ksoftirqd/0
root 7 2 0 0 0 18:06 ? 00:00:00 [migration/0
root 8 2 0 0 0 18:06 ? 00:00:00 [rcu_bh]
root 9 2 0 0 0 18:06 ? 00:00:01 [rcu_sched]
root 10 2 0 0 0 18:06 ? 00:00:00 [lru-add-dra
top 动态查看进程状态
[root@localhost ~]# top
top - 19:45:16 up 1:38, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 195 total, 1 running, 194 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0
KiB Mem : 2027892 total, 1416536 free, 211264 used, 400092 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1657380 avail Mem
ps -elf命令详解
基本语法
ps -elf
-
-e:显示所有进程(等同于-A)。 -
-l:长格式输出,显示更多字段(如F、S、PRI、NI)。 -
-f:完整格式输出,显示完整的命令行(CMD)和用户信息。
ps -elf 输出字段解析
执行 ps -elf 后,输出类似如下格式:
[root@localhost ~]# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 47733 ep_pol 18:06 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
1 S root 2 0 0 80 0 - 0 kthrea 18:06 ? 00:00:00 [kthreadd]
1 S root 4 2 0 60 -20 - 0 worker 18:06 ? 00:00:00 [kworker/0:0H]
1 S root 6 2 0 80 0 - 0 smpboo 18:06 ? 00:00:00 [ksoftirqd/0]
1 S root 7 2 0 -40 - - 0 smpboo 18:06 ? 00:00:00 [migration/0]
1 S root 8 2 0 80 0 - 0 rcu_gp 18:06 ? 00:00:00 [rcu_bh]
1 S root 9 2 0 80 0 - 0 rcu_gp 18:06 ? 00:00:01 [rcu_sched]
1 S root 10 2 0 60 -20 - 0 rescue 18:06 ? 00:00:00 [lru-add-drain]
5 S root 11 2 0 -40 - - 0 smpboo 18:06 ? 00:00:00 [watchdog/0]
各列含义如下:
| 字段 | 含义 | 详细说明 |
|---|---|---|
F |
进程标志(Flags) | 表示进程的权限和状态(十六进制数字),通常由内核使用,普通用户无需关注。 |
S |
进程状态(STAT) | 进程的当前状态(同 ps aux 的 STAT 列),如 R(运行)、S(睡眠)、Z(僵尸)等。 |
UID |
用户ID | 进程所有者的用户ID(如 root、www-data)。 |
PID |
进程ID | 进程的唯一标识符。 |
PPID |
父进程ID | 创建该进程的父进程ID(如 init 的 PPID 是 0)。 |
C |
CPU占用率 | 进程最近使用的CPU百分比(类似 top 中的 %CPU)。 |
PRI |
优先级(Priority) | 进程的调度优先级(数值越小优先级越高)。 |
NI |
Nice值 | 用户可调整的优先级修正值(范围 -20 到 19,默认 0)。 |
ADDR |
内存地址 | 进程的内存地址(通常为 -,表示无意义)。 |
SZ |
虚拟内存大小(KB) | 进程占用的虚拟内存大小(VSZ)。 |
WCHAN |
等待事件 | 进程正在等待的内核事件(如 poll、futex),- 表示运行中。 |
STIME |
启动时间 | 进程的启动日期或时间(如 May30)。 |
TTY |
控制终端 | 进程关联的终端(? 表示无终端,如守护进程)。 |
TIME |
CPU时间 | 进程累计使用的CPU时间(格式 HH:MM:SS)。 |
CMD |
命令行 | 进程的完整命令行(-f 选项显示完整路径和参数)。 |
关键字段详解
1. 进程状态(S 列)
与 ps aux 的 STAT 列相同,常见状态包括:
-
R:运行中(Running)。 -
S:可中断睡眠(Interruptible Sleep,等待事件)。 -
D:不可中断睡眠(Uninterruptible Sleep,通常与磁盘I/O相关)。 -
Z:僵尸进程(Zombie)。 -
T:已停止(Stopped,如被SIGSTOP暂停)。 -
I:空闲(Idle,内核线程)。
2. 优先级(PRI 和 NI)
-
PRI:进程的实际优先级(由内核动态调整,数值越小优先级越高)。 -
NI:Nice值(用户可调整的优先级修正值):-
-20:最高优先级(抢占更多CPU)。 -
19:最低优先级(CPU友好,适合后台任务)。
-
3. WCHAN 列
-
显示进程当前等待的内核事件(如
poll、futex)。 -
若为
-,表示进程正在运行或无需等待。
4. CMD 列
-
-f选项会显示完整命令行(包括参数),而ps aux默认截断长命令。
ps -elf vs ps aux
| 对比项 | ps -elf |
ps aux |
|---|---|---|
| 显示格式 | 长格式 + 完整命令行 | 简洁格式(部分截断命令行) |
| 关键字段 | F, PRI, NI, WCHAN |
%CPU, %MEM, STAT |
| 适用场景 | 查看进程优先级、父子关系、内核事件 | 快速查看CPU/内存占用和进程状态 |
| STAT 列 | S(同 ps aux 的 STAT) |
STAT |
3、pgrep
选项:
| -l | 同时显示进程名和PID |
|---|---|
| -o | 当匹配多个同一命令启动的进程时,显示进程号最小的那个 |
| -n | 当匹配多个同一命令启动的进程时,显示进程号最大的那个 |
[root@localhost ~]# pgrep -l nginx
8484 nginx
8485 nginx
4、top、htop
top:动态监控系统处理器状态,htop姑且称之为top的增强版
常用选项
-
-d:指定更新的间隔时间,以秒为单位。 -
-n:指定更新的次数。 -
-p:监控指定进程的 ID。 -
-u:监控指定用户的进程。
[root@localhost ~]# top -d 1 -n 1 | grep "%Cpu" | cut -d',' -f3 | tr -s ' ' | cut -d' ' -f2
0.0
常用按键
-
空格键:立即刷新显示。
-
M:按照内存使用百分比对进程进行排序。
-
P:按照 CPU 使用百分比对进程进行排序。
-
T:按照进程运行时间对进程进行排序。
-
q:退出 top 命令。
-
h:显示帮助信息。
案例
`top -d 5`:每隔 5 秒更新一次进程信息。
`top -n 2`:更新两次进程信息后退出。
`top -p 1234`:监控进程 ID 为 1234 的进程。
`top -u root`:监控 root 用户的进程。
二、进程管理命令
1、kill
选项:
| -l | 列出所有信号参数 |
|---|---|
| -a | 当处理当前进程时,不限制命令名和进程号的对应关系 |
| -u | 指定用户 |
| -p | 指定kill 命令只打印相关进程的进程号,而不发送任何信号 |
| -s | 发送指定的信号 |
| -9 | 强制杀死 |
| -0(数字零) | 用来检测一个进程是否存在。 |
2、pkill与killall
pkill是ps命令和kill命令的结合,按照进程名来杀死指定进程,pkill和killall应用方法差不多,也是直接杀死运行中的程序,如果想杀掉单个进程,请用kill来杀掉。
三、进程类型(前台类型驻留在右前端,后台类型驻留在右后端)
1、前台进程
在终端界面运行的进程,运行前台进程后,终端无法操作
2、后台进程
驻留在后端运行的进程
更多推荐

所有评论(0)