进程管理
进程管理
一、进程简介
1.1 进程三问
进程是什么?
- 程序在启动,运行时(执行命令,运行服务)都会产生进程,需要通过进程 来完成程序的工作
- 包含:内存地址空间、安全属性、执行线程、进程状态
- 程序 vs 进程:
- 程序:二进制文件(静态)如 /usr/bin/passwd
- 进程:程序运行过程(动态),有生命周期及状态
进程来源:
- 父进程通过 fork 创建子进程
- 所有进程的祖先进程:
- CentOS5/6: init
- CentOS7/8: systemd
进程状态:
- 运行状态产生原因:CPU时间片轮转
- 状态类型:
- R (运行) | S (睡眠) | T (停止)
- Z (僵尸) | X (死亡)
1.2 进程和pid(Process ID)
在Linux系统中,PID(Process ID) 是 进程标识符(Process Identifier) 的缩写。它是一个唯一且 非负的整数,用于在操作系统中唯一标识一个正在运行的进程。每个进程(包括程序、服务、后台任务 等)启动时都会被分配一个PID,系统通过PID管理和跟踪进程的生命周期。
[root@xnha ~]# ps |
进程还可能会产生子进程。一个父进程复制自己(fork)来创建一个新的子进程。每个进程分配一个唯一的 标识(pid),其父进程的标识为ppid. 在 centos8,centos7中第一个第1个进程为systemd,在centos6及以 前版本第1 个进程为init.
[root@xnha ~]# pstree #pstree命令可以查看所有进程的关系(树状结构显示) |
1.3 进程的状态
进程从产生到关闭有很多种状态

总结常见的状态
| 进程状态 | 说明 |
|---|---|
| R | 运行状态,cpu正在运算此进程或者进程正在等待cpu中。 |
| S | 可中断睡眠。进程在等待某个事件完成,可以被唤醒 |
| D | 不可中断睡眠。进程在等待硬件条件,不能被唤醒(无法被kill终止) |
| T | 停止。进程被信号或调试器暂停,可恢复运行。 |
| Z | 僵尸进程。进程已终止,但其资源未被父进程回收。僵尸进程不占用资源,但会占用进程ID |
1.4 PID的核心作用
1.唯一标识进程
每个进程的PID在系统范围内是唯一的(同一时刻不会重复),通过PID可以精准定位到具体的进程。
2.进程管理
- 系统工具(如
kill、top、ps)和用户通过PID对进程进行控制,例如:- 终止进程: kill -9 PID
- 查看进程资源占用: top -p PID
- 调试进程: gdb -p PID
3.进程间通信(IPC)
进程间通信(如信号、管道、共享内存)通常需要指定目标进程的PID。
4.PID的分配规则
- 取值范围
- PID从 1 开始分配(系统启动后的第一个进程是 init 或 systemd ,PID=1)。
- 最大PID值由内核参数 /proc/sys/kernel/pid_max 定义(默认通常为 32768 )。
- 当PID达到最大值时,会循环使用已释放的PID(但不会重复分配给仍在运行的进程)。
回收机制
进程终止后,其PID会被释放,供后续新进程使用。
5.PID的特殊角色
PID=1(Init进程)
- 系统启动后的第一个进程,负责启动和管理其他所有用户进程。
- 如果PID=1的进程终止,系统会触发内核恐慌(Kernel Panic)并崩溃。
父进程PID(PPID)
每个进程(除Init)都有父进程(Parent Process),父进程的PID称为 PPID。
通过 ps -ef 查看PPID:
ps -ef | grep <进程名>
# 输出示例:
# UID PID PPID C STIME TTY TIME CMD
# root 1234 1 0 Aug01 ? 00:00:00 nginx: master process- 第三列(PPID)是父进程的PID(如
1表示由init进程启动)。
- 第三列(PPID)是父进程的PID(如
二、进程管理(ps、pstree、top)
ps (Process Status)是 Linux 中用于查看当前系统进程状态的工具。它可以显示进程的详细信息,如 进程 ID(PID)、CPU 和内存占用、运行时间、命令行参数等。
2.1 基本语法
ps [选项] |
2.2 常用选项
显示进程范围
选项 说明 -e或-A 显示所有进程(包括其他用户进程) -a 显示所有终端进程(除会话领导者) -x 显示不关联终端的进程(如守护进程) -u [用户] 显示指定用户的进程(如 -u root)示例
[root@xnha ~]# ps -e # 显示所有进程,按Pid升序排列
PID TTY TIME CMD
1 ? 00:00:02 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 rcu_gp
4 ? 00:00:00 rcu_par_gp
6 ? 00:00:00 kworker/0:0H-kblockd
7 ? 00:00:00 kworker/u256:0-events_unbound
8 ? 00:00:00 mm_percpu_wq
9 ? 00:00:00 ksoftirqd/0
10 ? 00:00:00 rcu_sched
11 ? 00:00:00 migration/0
12 ? 00:00:00 watchdog/0
13 ? 00:00:00 cpuhp/0
tty字段解析:
表示物理控制终端

在 ps 命令的输出中, TTY 列表示进程关联的终端设备
- tty :进程运行在物理控制台终端。
- pts/0 :进程运行在伪终端(如图形界面的终端或 SSH 会话)。
- ? :进程不关联任何终端(如守护进程或内核线程)
[root@xnha ~]# ps -a #所有由终端创建的进程,不包含bash\shell,不包含 |
stat 字段解析:
在 Linux 的 ps 命令中,STAT(Process State)字段表示进程的当前状态。每个状 态由 1个主字母 和 可选的修饰符 组成(如 R+ 、 Ss )
主状态:
- R (Running / Runnable)运行/可运行状态
通俗解释:就像在银行排队等叫号的人。
正在运行:当前正在窗口办理业务(实际在用 CPU)。
可运行:已经取号,坐在椅子上等待叫号(在 CPU 的等待队列中)。
实际场景:你用 top 命令看到的 CPU 使用率高的进程,通常处于 R 状态。
$ ps aux | grep ' R ' # 查看所有运行中的进程
- S (Interruptible Sleep)可中断睡眠
通俗解释:你点外卖后等外卖,但可以边等外卖边刷手机。如果快递到了(事件发生),你就去取;如果不想等了(收到信号),可以取消订单。
实际场景:
进程等待用户输入(如 vim 未操作时)。
等待网络响应(如浏览器加载网页时)。
唤醒方式:按回车键、收到信号(如 Ctrl+C 终止进程)。
$ sleep 100 # 输入后按 Ctrl+Z,进程进入 S 状态
- D (Uninterruptible Sleep)不可中断睡眠
通俗解释:你在手术室做手术,医生让你别动。此时即使有人叫你(发信号),你也无法回应,必须等手术完成。
实际场景:
进程等待磁盘 I/O(如写入大文件到 U 盘,突然拔掉 U 盘)。
风险:进程卡在 D 状态无法终止(即使 kill -9 也无效)。
解决方案:重启系统或修复硬件/驱动。
$ ps aux | grep ' D ' # 查找 D 状态进程
- Z (Zombie)僵尸进程
通俗解释:餐厅吃完饭,服务员(父进程)没来收拾桌子(回收资源),桌子一直占着。
实际场景:父进程未正确处理子进程的终止状态。
无害性:僵尸进程不占用 CPU/内存,只占一个 PID。
清理方法:
$ kill -9 父进程PID # 终止父进程,僵尸进程由 init 回收
- T (Stopped)暂停状态
通俗解释:你正在看视频,突然按下暂停键,画面定格。
实际场景:
用 Ctrl+Z 暂停前台进程(如 ping 命令)。
恢复方法:
$ bg # 让进程后台继续运行(状态变回 S)
$ fg # 让进程回到前台运行(状态变回 R/S
2.3输出字段详解
常用输出列及其含义:
| 字段 | 说明 |
|---|---|
| PID | 进程ID |
| PPID | 父进程ID |
| USER | 进程所有者 |
| %CPU | CPU占用率 |
| %MEM | 内存占用率 |
| VSZ | 虚拟内存大小(KB) |
| RSS | 物理内存大小(KB) |
| TTY | 关联的终端 |
| STAT | 进程状态(如 S=睡眠,R=运行) |
| START | 进程启动时间 |
| TIME | 累计CPU时间 |
| COMMAND | 启动命令([]表示内核线程) |
2.4常用选项
| 选项 | 说明 |
|---|---|
-e |
显示所有进程(包括其他用户的进程)。等价于 BSD 风格的 aux。 |
-f |
显示完整格式的输出,包括 UID、PID、PPID、启动时间等详细信息。 |
-u 用户名 |
显示指定用户的进程。例如:ps -u username。 |
-p PID |
显示特定 PID 的进程信息。例如:ps -p 1234。 |
-C 命令名 |
显示指定命令的进程。例如:ps -C sshd。 |
-o 格式 |
自定义输出格式。例如:ps -eo pid,comm 显示 PID 和命令名。 |
--sort 字段 |
按指定字段排序。例如:ps -eo pid,%cpu --sort=-%cpu 按 CPU 使用率降序排序。 |
-t tty |
显示与指定终端关联的进程。例如:ps -t pts/0。 |
-x |
显示没有控制终端的进程(常用于守护进程)。 |
1.经典组合:ps aux
- 说明:BSD 风格,显示所有进程的详细信息。
- 输出字段:USER、PID、%CPU、%MEM、VSZ、RSS、TTY、STAT、START、TIME、COMMAND。
2.系统进程查看:ps -ef
- 说明:Unix 风格,显示所有进程的完整信息。
- 输出字段:UID、PID、PPID、C、STIME、TTY、TIME、CMD。
2.5 动态查看进程top
top 是 Linux 中最常用的实时系统监控工具,能够动态显示 进程资源占用 和 系统整体状态。它提供了 交互式操作,方便用户快速分析性能瓶颈
基础语法
top # 启动 top
q 或 Ctrl+C # 退出 top
交互式命令(运行中按快捷键)
命令 功能 k 终止进程(输入 PID,再输入信号,默认 SIGTERM )。 r 调整进程优先级(输入 PID,再输入 Nice 值)。 p 按 CPU 使用率排序。 m 按内存使用率排序。 t 按运行时间排序。 n 按 PID 排序。 z 切换颜色高亮显示。 c 显示完整命令路径。 1 展开显示每个 CPU 核心的负载。 h 查看帮助信息。 空格 立即刷新界面。
2.6信号控制
信号列表
kill -l #查看所有信号
[root@xnha ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX常用信号
信号 说明 1 SIGHUP(重载配置)/重刷新一个进程,主要用户服务的刷新 9 SIGKILL (强制终止)/杀掉一个进程,但不杀掉其子进程(centos7) 15 SIGTERM (正常终止)/杀掉进程及其子进程 18 SIGCONT (恢复执行) 19 SIGSTOP (暂停)/暂停一个进程 实验
1.启动一个httpd服务(会产生多个进程)
[root@xnha ~]# systemctl restart httpd
2.查找所有httpd进程
[root@xnha ~]# ps -ef | grep httpd
root 8267 1 0 11:16 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
#8267是httpd服务的主进程,其他都是子进程
apache 8283 8267 0 11:16 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8284 8267 0 11:16 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8285 8267 0 11:16 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8286 8267 0 11:16 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 8508 3582 0 11:17 pts/1 00:00:00 grep --color=auto httpd
3.对httpd的主进程发送信号1
[root@xnha ~]# kill -1 8267 #当服务配置变更以后,可以通过-1来刷新主进程
[root@xnha ~]# ps -ef | grep httpd #主进程pid没变,子进程Pid全变了
root 8267 1 0 11:16 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8549 8267 0 11:20 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8550 8267 0 11:20 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8551 8267 0 11:20 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8552 8267 0 11:20 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 8766 3582 0 11:20 pts/1 00:00:00 grep --color=auto httpd
4.对httpd的主进程发送信号15,查看服务状态
[xnha ~]# ps -ef | grep httpd
root 8810 3582 0 11:22 pts/1 00:00:00 grep --color=auto httpd
[root@xnha ~]# ps -ef | grep httpd |grep -v grep
[root@xnha ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor pres>
Active: inactive (dead)
Docs: man:httpd.service(8)
5.重新启动httpd服务,对主进程发送信号9
[root@xnha ~]# systemctl restart httpd
[root@xnha ~]# ps -ef | grep httpd |grep -v grep
root 8865 1 0 11:25 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8872 8865 0 11:25 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8873 8865 0 11:25 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8874 8865 0 11:25 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8875 8865 0 11:25 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
[root@xnha ~]# kill -9 8865
[root@xnha ~]# ps -ef | grep httpd |grep -v grep
[root@xnha ~]# #所有进程都没了(centos8中子进程依然存在,可以提供服务)

2.7 进程优先级
NICE值范围
-20 (最高)到19(最低)
查看优先级:
ps axo pid,command,nice --sort=-nice
2.8 作业控制
linux可以在一个终端中管理多个任务进程(这些进程称之为job)。 有些进程会占用终端运行很久或是一直 占用终端,那么想要运行第二进程 就无法操作了, 所以进程可以放到后台执行,这样就不影响在同一个 终端运 行第二个进程了
前后台管理
[root@shanxun ~]# jobs -l #查看当前终端运行的job,目前为空
[root@shanxun ~]# sleep 100000 #此命令为等待100000秒,也就是说会占用终端
100000秒
#使用ctrl+c取消,此时sleep 100000还没有
完成工作
[root@shanxun ~]# sleep 100000& # &为后台符号,这样sleep 100000可以在终
端后台继续运行
[1] 9262
[root@shanxun ~]# ps -ef | grep sleep
root 9261 1059 0 11:36 ? 00:00:00 sleep 60
root 9262 3582 0 11:36 pts/1 00:00:00 sleep 100000
root 9270 3582 0 11:36 pts/1 00:00:00 grep --color=auto sleep
[root@shanxun ~]# jobs -l #jobs -l可以查看到了
[1]+ 12615 Running
[root@shanxun ~]# fg %1 # fg命令将job由后台转到终端前台运行,%1代
表第1个job
sleep 100000 #按ctrl+z可以将占用前台的进程转到后台暂停执
行
[1]+ Stopped
[root@shanxun ~]# jobs -l
[1]+ 12615 Stopped sleep 100000 & #确认为stop状态
[root@shanxun ~]# bg %1 # bg命令将后台stopped状态的进程转为后台
running运行状态
[1]+ sleep 100000 &
[root@shanxun ~]# jobs -l
[1]+ 12615 Running sleep 100000 & #确认为运行状态注意
kill 1:终止PID为1的进程(系统进程)kill %1:终止作业号为1的后台进程
2.9 虚拟文件系统 proc
关键文件
/proc/cpuinfo # CPU信息 |
查看命令
cat /proc/cpuinfo # 查看CPU详情 |








