第十篇:系统管理体系之进程管理
进程
进程、程序、守护进程
名字 | 含义 |
程序 | 安装包、程序代码、app(存放在磁盘上面) |
进程 | 正在运行的程序、命令、服务都可以称为进程(运行在内存中) |
守护进程 | 持续运行的进程,也可以叫做服务 |
异常进程的分类
僵尸进程⭐⭐⭐⭐⭐
# 僵尸进程 当子进程比父进程先结束,而父进程没有回收子进程和释放子进程所占有的资源,此时子进程将成为一个僵尸进程 # 查找僵尸进程 ps aux 过滤Z状态 top 命令 # 解决 找出僵尸进程上级进程,结束进程即可 如果上级进程是主进程(pid=1),则需要重启linux系统
孤儿进程
- 孤儿进程:父进程执行完成或被终止后子进程仍在继续运行
- 孤儿进程会被系统直接接管(ststemd进程)
僵尸进演示⭐⭐⭐⭐⭐

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> int main() { pid_t pid; // 创建一个子进程 pid = fork(); if (pid < 0) { // fork 失败 perror("fork failed"); exit(1); } else if (pid == 0) { // 子进程 printf("子进程: 我是子进程,PID=%d\n", getpid()); // 子进程执行完之后直接退出 exit(0); } else { // 父进程 printf("父进程: 我是父进程,PID=%d,子进程PID=%d\n", getpid(), pid); // 父进程不调用 wait,使得子进程成为僵尸进程 printf("父进程: 睡眠 30 秒,不调用 wait,导致僵尸进程的产生。\n"); sleep(30); // 父进程睡眠 30 秒 // 父进程将退出 printf("父进程: 睡眠结束,父进程将退出。\n"); exit(0); } }
1)通过gcc生成僵尸进程的命令文件
# gcc命令 gcc是一个广泛使用的开源编辑器,主要用于编译C、C++、Fortran等编程语言的源代码 -o 用于指定输出文件的名称 [root@yuan ~]# ll zombine* -rw-r--r--. 1 root root 975 9月 21 19:54 zombine.c [root@yuan ~]# gcc zombine.c -o zombine [root@yuan ~]# ll zombine* -rwxr-xr-x. 1 root root 8704 9月 21 20:18 zombine -rw-r--r--. 1 root root 975 9月 21 19:54 zombine.c [root@yuan ~]#./zombine
2)top命令查看是否有僵尸进程
3)过滤出僵尸进程
[root@yuan ~]# ps aux |grep Z # 找出僵尸进程的pid USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1954 0.0 0.0 0 0 pts/0 Z+ 19:58 0:00 [zombine] <defunct> root 1923 0.0 0.0 112824 956 pts/1 R+ 19:58 0:00 grep --color=auto Z
僵尸进程的pid为1954
4)pstree -p查看僵尸进程的父进程
# pstree属于psmisc软件包,需要用yum命令下载 [root@yuan ~]# pstree -p |grep 1954 |-sshd(1484)-+-sshd(1729)---bash(1733)---zombine(1953)---zombine(1954)
5)结束僵尸进程
# 直接结束僵尸进程 kill 1954 # 失败,无法直接结束僵尸进程 # 结束僵尸进程的父进程 kill 1953 # 成功
进程监控指令⭐⭐⭐⭐⭐
监控命令 | 含义 |
ps | 静态:process status ps查看当前瞬间进程状态,一般用于临时检查或取值 |
top | 动态:整体查看系统状态(负载、僵尸进程、cpu、内存...)类似于windows的任务管理器 |
ps命令格式
概述
- ps -ef(everyon:显示所有用户的所有进程 full:以完整的格式显示进程的信息)
- UID:进程属于的用户
- PID:进程id号,大部分都是随机
- PPID:父进程的id号 pstree -p查看进程与父进程之间详细关系
- CMD:进程名字
- ps aux(all:显示所有用户的进程 user:以用户友好的形式显示进程 )
- ps aux 比 ps -ef 显示的内容多(cpu的使用率、内存的使用率、进程状态...)
ps aux每一列含义
ps aux每一列的含义 | |
第1列:USER | 启动进程的用户的用户名 |
第2列:PID
|
进程号 |
第3列:%CPU | 进程占用cpu百分比 |
第4列:%MEM | 进程占用内存百分比 |
第5列:VSZ | 进程占用虚拟内存的大小(KB) |
第6列:RSS | 进程占用物理内存的大小(KB) |
第7列:TTY | 进程使用的终端(?表示没有控制终端) |
第8列:STAT | 进程状态码,显示进程的当前状态 |
第9列:START | 进程启动时间 |
第10列:TIME | 进程占用cpu时间 |
第11列:COMMAND | 进程名字(命令、选项、参数) [ ]括起来的是内核进程,其他是系统进程 |
进程状态⭐⭐
- 进程状态:正在运行的进程、僵尸进程、正在进行io的进程、前台或后台运行的进程
- 进程状态=基本状态+附加状态
STAT基本状态 | 描述 |
R(running) | 进程运行 |
S | 可中断进程(可以随时停止) |
T(terminate) | 进程被暂停(挂起)ctrl + z |
D | 不可中断进程(进程正在进行io操作) |
Z(zombie) | 僵尸进程(异常的进程) |
STAT状态+附加状态 | 描述 |
S/s | 进程是控制进程(父进程/主进程) |
< | 优先级较高的进程 |
N | 优先级较低的进程 |
+ | 当前进程运行在前台 |
l(小写L) | 进程是多线程 |
常见的进程状态
- R+ 前台运行中的进程
- R 后台运行的进程
- S 可中断的进程
- T 后台挂起的进程
- D 不可中断的进程(io进程)
- Ss 可中断的管理进程
- S< 可中断的高优先级进程
- Ssl 可中断的多线程的管理进程
- Z 僵尸进程
top命令格式
top命令详解
- top命令默认是个交互式命令
- top命令类似于windows任务管理器,可以展示系统负载信息,进程信息,cpu,内存信息
top基础使用与快捷键⭐⭐⭐⭐⭐
基础必会用法 | |
q | 退出 |
空格 | 空格立即刷新(默认3秒刷新一次) |
P | 按照CPU使用率排序(默认是按照cpu使用率排序) |
M | 按照内存使用率排序 |
进阶用法 | |
z | 进入颜色模式 |
x | 标记处当前是按照那列进行排序 |
shift + > | 向右 |
shift + < | 向左 |
- htop(top命令升级版,支持鼠标操作)
- 说明:htop是epel源中的命令
top命令的非交互式
需要获取top命令的结果,需要在非交互模式下执行
# 案例:取出top中的第二行最后两列的信息 top |awk 'NR=2' top -bn1 |awk 'NR=2' -b 非交互模式 -n 输出结果的次数 top -bn1 |awk 'NR = 2' |awk '{print $(NF-1),$NF}'
案例
案例1:过滤出crond进程信息⭐⭐⭐
# 案例:过滤出crond进程信息 [root@yuan ~]# ps aux |grep crond root 1098 0.0 0.0 126388 1680 ? Ss 19:18 0:00 /usr/sbin/crond -n root 1872 0.0 0.0 112824 980 pts/0 R+ 21:10 0:00 grep --color=auto crond [root@yuan ~]# ps -ef |grep crond root 1098 1 0 19:18 ? 00:00:00 /usr/sbin/crond -n root 1874 1755 0 21:10 pts/0 00:00:00 grep --color=auto crond # 过滤的时候可以通过grep -v grep 排除grep命令自己的进程 [root@yuan ~]# ps -ef |grep crond |grep -v grep root 1098 1 0 19:18 ? 00:00:00 /usr/sbin/crond -n
案例2:按照树形结构查看进程信息⭐⭐⭐
pstree pstree -p # 显示树型结构并输出pid ps auxf # 可以展示部分所属关系,没有pstree直观
案例3:根据要求,只显示某些内容⭐⭐⭐
# 案例:根据要求取出ps命令结果中的部分内容 # ps aux [root@yuan ~]# ps aux |awk '{print $1,$3}' USER %CPU root 0.0 root 0.0 root 0.0 # 用该方法取cmd这一列会导致数据缺失 # awk倒序取列 [root@yuan ~]# echo 1 a b yuan 996 |awk '{print $NF}' 996 [root@yuan ~]# echo 1 a b yuan 996 |awk '{print $NF-1}' 995 [root@yuan ~]# echo 1 a b yuan 996 |awk '{print $(NF-1)}' yuan # ps aox ps命令的选项,输出指定的内容(小写) [root@yuan ~]# ps axo user,%cpu,stat USER %CPU STAT root 0.0 Ss root 0.0 S root 0.0 S< # 不显示标题 [root@yuan ~]# ps --no-heading axo user,%cpu root 0.0 root 0.0
案例4:过滤出某个服务的进程信息
# 案例:过滤出crond服务的进程信息(pid、%cpu、%mem、command) [root@yuan ~]# ps aux |grep 'crond' |awk '{print $2,$3,$4,$11}' 1098 0.0 0.0 /usr/sbin/crond 1921 0.0 0.0 grep # 完全使用ps命令过滤 [root@yuan ~]# ps --no-heading -o pid,%cpu,%mem,command -C crond 1098 0.0 0.0 /usr/sbin/crond -n
--no-heading 不显示标题 -C 过滤(注意不要加上ax) -o 指定输出列
案例5:取出所有进程中内存使用率最高的前2行
# 案例:取出所有进程中内存使用率最高的前2行 [root@yuan ~]# ps --no-heading aux |sort -rnk4 |head -2 root 1115 0.0 1.4 359104 29744 ? Ssl 19:18 0:00 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid root 1479 0.0 0.8 574288 17464 ? Ssl 19:18 0:01 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
后台管理
- 前台进程是在用户的终端中直接运行的进程,用户可以与之交互。
- 后台进程是在用户的终端中运行,但不占用终端的控制,可以在后台执行任务
软件后台运行方法 | 说明 | 应用场景 |
命令 & | 后台运行 | 大部分的时候应用 |
nohup 命令 & | 与&类似,会将记录输出到文件中(默认叫nohup.out) | 应用于将记录输出 |
先运行命令,然后按ctrl+z(后台挂起) | 软件进入后台运行 | 顽固软件ctrl+c无法结束,可以通过这个方法结束该软件 |
screen命令 | 通过软件创建空间,让这个命令在这个空间运行 | 稳定 |
命令 &⭐⭐⭐⭐⭐
[root@yuan ~]# sleep 30 & [1] 1818 [root@yuan ~]# ps aux |grep 1818 root 1818 0.0 0.0 108052 356 pts/0 S 20:12 0:00 sleep 30 root 1820 0.0 0.0 112824 976 pts/0 R+ 20:13 0:00 grep --color=auto 1818 [1] 1818 [1]:表示手动进入到后台运行的第1个进程 1818:表示进程的pid [root@yuan ~]# jobs # 查看手动进入后台的进程 [1] 运行中 sleep 30 &
nohup 命令 &
与&不同:可保留输出到指定文件中(默认是nohop.out文件)
# 案例:让ping baidu.com 命令后台运行并记录输出 nohup ping -c20 baidu.com & tail -f nohup.out ping -c 表示ping多少次 # 如果想输出到其他文件 nohup 命令 >新的文件 & nohup ping baidu.com >lidao-new.txt &
ctrl + z (使用较少)
- 这个快捷键不是撤销
- 在Linux下面表示让当前运行的命令或服务进入后台挂起
- 如果转为前台需要输入bg / fg
screen⭐⭐⭐
一般我们使用&、nohup方法让命令、服务进入后台运行可能不稳定
screen命令可以使一些命令较为稳定的在后台运行
简易原理:创建screen空间,命令只要在空间里,里面的命令就不会断(后台运行)
# 1、安装screen yum install -y screen # 2、运行screen screen # 进入screen虚拟窗口 # 3、执行命令 输入命令 ping www.baidu.com # 4、退出screen窗口 ctrl + a 然后按 d(正常退出) 断网、断开连接(异常退出) # 5、查看screen窗口 screen -ls # 6、恢复 screen -r 要恢复的screen虚拟窗口 # 7、彻底结束(删除当前虚拟窗口) ctrl + d
杀手三剑客(三个用于结束进程的命令)
命令 | 说明 |
kill(常用) | kill + 进程的pid (结束进程) |
pkill(慎用) | pkill + 进程名字(模糊名字) (模糊删除) |
killall | killall + 进程名字(精确名字) |
- kill信号
- kill pid 默认发送结束信号
- kill -9 pid 放松强制结束信号(别用kill -9 结束数据库)
负载
概述
- 负载(load average):平均负载,最近1分钟、5分钟、15分钟系统平均负载
- 负载:衡量系统繁忙程度的指标
- 衡量是否繁忙:数值越接近cpu核心总数,系统的负载越高
- 预警:负载达到cpu核心总数的70-80%
# 负载原理 平均负载:平均负载指的是单位时间内,系统处于可运行状态(R、S) 和不可中断状态(D)的平均进程数,也就是平均活跃进程数 负载是衡量正在运行的进程的平均数(可中断进程和不可中断进程)
负载高的排查步骤
- 1、通过监控软件发现系统负载高(w,lscpu查看)
- 2、判断是cpu还是io导致的负载高
- cpu高:top中的us(user 用户占用的cpu)、sy(system 系统占用的cpu)
- io高:top中的wa(iowait)磁盘io导致的负载高
- 3、定位
- 如果是cpu导致的,排查出哪个进程导致的(ps aux过滤出占用cpu高的进程)
- 如果是io导致的,排查出哪个进程导致的(通过iotop -o命令排查)
- 4、未完待续(具体分析进程啥问题第二阶段解答)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现