Linux 进程管理与系统监控 (Process Management & System Monitoring) 详解
目录
5.1 Linux中的服务(Service)是什么?服务管理呢?
Δ前言
- 大家好,这篇博文主要给大家带来 Linux 进程管理和系统监控的内容分享,和上一篇博文(用户组管理和权限控制)类似,这篇博文其实也算作是 “Linux 常见实用命令汇总及实战演示-CSDN博客” 一文的补充和完善,因为内容太多了不能放一篇里面。
- 本篇博文共分为两大部分:“一、进程管理” 和 “二、系统监控”。因为命令比较多,有些命令没有附上运行截图,后面还会陆续补充完善。
一、进程管理
1.什么是进程:
- 在 Linux 中,进程(Process) 是指计算机中已运行的程序的实体。通常我们可以理解为:程序是静止的代码(是死死的),而进程是这些代码在内存中跑起来的状态(是活活的)。
- 在 Linux 中,根据进程(Process)的执行方式,进程又可细分为 前台进程 和 后台进程,如下——
- (1) 前台进程:指那些在终端屏幕上运行,且运行过程中会占据使用者的 命令行窗口,让用户无法输入其他命令的进程。
- (2) 后台进程:指那些在后台默默运行,不占用当前终端窗口,你可以一边让它跑着,一边继续在命令行干别的事。
- 服务与进程的关系:服务(Service) 本质上就是一种特殊的进程。它通常以 “后台进程” 的方式常驻内存,等待处理特定的请求(比如网络请求、定时任务等)。在 Linux 中,我们常把这些服务进程称为“守护进程(Daemon)”。
2.ps命令 和 pstree 命令 详解:
① ps 命令(静态查看): ps 命令是 Linux 查看进程最基础的工具。我们最常用的是 ps -aux 命令,其中,每个参数的含义如下表所示:
参数选项 含义 -a显示所有终端下的进程(包括其他用户的) -u显示面向用户的格式(显示用户名、CPU/内存使用率等) -x显示没有控制终端的进程(通常是后台守护进程) ② 一段 ps -aux 命令的运行结果,示意图如下:
其中,ps -aux 命令的字段解释,如下表所示:
列名 含义 示例解读 USER 进程所属的用户 root、user1、mysql PID 进程ID(唯一标识) 1 是init进程(所有进程的祖先) %CPU CPU使用率(百分比) 2.3 表示占用2.3%的CPU %MEM 内存使用率(百分比) 3.2 表示占用3.2%的物理内存 VSZ 虚拟内存大小(KB) 进程申请的虚拟内存总量 RSS 常驻物理内存大小(KB) 实际占用的物理内存 TTY 终端设备 ?表示没有控制终端(后台服务)STAT 进程状态 S=sleep,R=running,Z=zombie START 进程启动时间 08:15(今天8:15启动) TIME 累计CPU占用时间 2:15(已占用CPU 2分15秒) COMMAND 执行的命令 启动进程的命令行 ③ 【ps -aux 实战案例】
查找某个特定程序是否在运行: 在运维中,我们常配合管道符 grep 使用。比如 up 想康康 Nginx 服务是否开启:
ps -aux | grep nginx # 快速拿到 Nginx 的 PID,方便后续管理。④ pstree 命令(树状查看):如果我们想 直观地 看到进程之间的层次关系,可以使用 pstree 指令。
(1) pstree -p:不仅显示进程树,还把 PID 标注出来。
(2) pstree -u:显示进程所属的用户。
pstree 命令的执行效果图,如下所示:
3.父子进程:
案例 —— Nginx 的“Master-Worker”架构:
在高性能 Web 服务器 Nginx 中,我们会看到一个很有意思的现象: 当我们搜索 Nginx 进程时,你会发现有一个 Master 进程 和多个 Worker 进程。其中:(1) Master 进程(父):负责读取配置文件、管理 Worker 进程。它并不处理具体的网络请求。
(2) Worker 进程(子):由 Master 进程 fork(衍生)出来,专门负责处理用户的 HTTP 请求。
如果某个 Worker 进程因为代码异常崩溃了,Master 进程作为“父亲”会立刻感知到,并瞬间启动一个新的子进程来顶替它。这种“父管子”的模式极大地保证了服务器的高可用性。
4.如何终止运行中的进程?
① 终止进程:
当进程出现死锁、耗尽资源或者我们需要手动关停某个服务时,我们就需要手动“杀掉”进程,就像原神中打深渊一样必须斩草除根!
具体来说,主要的指令是 kill 和 killall。
- kill [PID]:向进程发送终止信号。
- kill -9 [PID]:强制杀死进程(-9 为强制信号)。
- killall [进程名]:按照名字批量杀死。
② 实用案例:
清理假死的 Java 应用: 当某个 Tomcat 或 SpringBoot 应用占着内存不释放且无法响应请求,然后我们通过 ps 查到 PID 为 8888 后: kill -9 8888 这是运维中最常见的 “重启大法” 第一步。
停止异常的数据库备份任务: 由于磁盘空间不足,一个 mysqldump 备份进程卡住了。此时直接按 Ctrl+C 也触发不了元素反应: killall mysqldump 批量清理所有备份进程,防止磁盘被填满。
踢掉非法登录的 SSH 用户: 通过 ps -aux 发现某个不认识的 IP 通过 SSH 登录了你的服务器。找到该 sshd 进程对应的 PID: kill 12345 直接中断对方的连接会话。
强制关停占用端口的 Python 爬虫: 如果发现写错死循环的爬虫脚本正在疯狂抓取数据并占用了 8080 端口,导致其他程序起不来: kill -9 [脚本PID] 快速释放端口资源,修复开发环境。
5.Service管理:
5.1 Linux中的服务(Service)是什么?服务管理呢?
- 什么是服务:我们在上文 “什么是进程” 中已经提到,服务(Service)本质上是常驻在后台的守护进程(Daemon)。它们在后台默默地听候指令,比如 sshd 服务负责远程连接,httpd 服务负责处理网页请求。
- 什么是服务管理:指的是对这些进程进行状态控制(启动、停止、重启)以及对它们的生命周期进行配置(开机是否自启、崩溃是否自动拉起等)。
5.2 service管理指令
service 是早期的管理工具,主要用于 CentOS 6 等旧版本。
基本语法:service 服务名 [start | stop | restart | reload | status]
现状说明:虽然在 CentOS 7+ 版本中,大部分 service 指令会自动重定向到 systemctl,但它已经成为时代的眼泪。了解它主要是为了维护一些老旧的脚本或老系统,正常情况下的使用,肯定还是要用 systemctl。
5.3 如何查看Linux中的服务名?
查找服务名是实现服务管理的前提,通常有两种主流方式:
- 旧式方式(脚本查看): 查看 /etc/init.d/ 目录下的脚本,这些通常是传统 SysV 风格的服务脚本。 ls /etc/init.d/ 运行结果示意图如下:
- 新式方式(Systemd 查看): 查看被 systemd 管理的所有单元文件: systemctl list-unit-files --type=service (这能让你看到哪些服务已安装,以及它们是否被设置为开机启动). 运行结果示意图如下:
5.4 chkconfig指令 详解
chkconfig 用于管理服务在不同运行级别(Runlevel)下的自启动状态。
常用案例:
- 查看所有服务的自启动配置:chkconfig --list
- 设置网络服务在 3 和 5 级别下自启动:chkconfig --level 35 network on
- 关闭防火墙的开机自启(旧版):chkconfig iptables off
5.5 systemctl指令 详解
systemctl 命令 是现代 Linux(Systemd 机制)的权力中心,它合并了以往 service 和 chkconfig 的功能,且功能更牛逼。
基本语法:systemctl [动作] [服务名]
- 运行状态控制(即时生效,重启失效): (以 Linux 中最常用的防火墙服务 firewalld 为例)
- 启动服务:systemctl start firewalld
- 停止服务:systemctl stop firewalld
- 重启服务(先停再启,常用于修改配置后):systemctl restart firewalld
- 重新加载配置(不停止服务,仅使新配置生效):systemctl reload firewalld
- 查看服务详情(可以看到服务是否在运行、PID、报错日志):systemctl status firewalld
自启动控制(永久生效,决定开机后的状态):(以 Linux 中最常用的防火墙服务 firewalld 为例)
设置开机自启: systemctl enable firewalld
取消开机自启: systemctl disable firewalld
检查服务是否设置了自启动:systemctl is-enabled firewalld
查看服务是否处于激活状态(返回 active 或 inactive):systemctl is-active firewalld
Δ实战案例:【故障排查与自定义服务】
案例 1:当 Nginx 启动失败时的全深度排查, 如果我们执行 systemctl start nginx 报错,常规做法是:
- 执行 systemctl status nginx -l:-l 参数会显示完整的报错详情,不会截断。
- 如果 status 信息不够,配合 journalctl -u nginx.service 查看内核及系统层面的详细启动日志。
案例 2:将自己的 Python 脚本打包成系统服务 ,假设我们写了一个 my_api.py,并且希望它像服务一样开机自启、死后自动重启:
- 在 /etc/systemd/system/ 下新建 my_api.service。
- 写入 ExecStart=/usr/bin/python3 /path/to/my_api.py。
- 写入 Restart=always:这意味着如果我们的程序崩了,系统会在 5 秒内自动帮你拉起来。
- 最后执行 systemctl daemon-reload 和 systemctl enable --now my_api。
5.6 firewall指令 详解
在 CentOS 7+ 中,我们使用 firewall-cmd 来管理防火墙。
- 常用操作:
- firewall-cmd --state:查看状态。
- firewall-cmd --list-all:查看当前放行的所有端口。
- firewall-cmd --reload:重新加载(修改配置后必须执行)。
- 案例场景:假设我们新部署了一个 Web 网站,需要开放 80 端口,且要求重启后依然生效。
- firewall-cmd --permanent --add-port=80/tcp(--permanent 参数保证重启不失效)。
- firewall-cmd --reload(让配置立刻生效)。
- 通过 firewall-cmd --query-port=80/tcp 确认开放成功。
5.7 top命令 详解
top 是 Linux 系统中最常用的实时系统监控工具,相当于系统的“任务管理器”。它会动态刷新,显示系统资源使用情况和进程列表。
一张 top 命令的运行示意图如下所示:
- top 命令的显示内容说明:
- load average:系统的负载情况(1, 5, 15 分钟),如果数值超过了 CPU 核心数,说明系统很累。
- %Cpu(s):查看 CPU 是否被某个进程榨干。
- MiB Mem:内存剩余及使用情况。
- MiB Swap: 交换分区状态
- 进程列表的各个 字段 解析,如下表所示:
字段 含义 详细说明 PID 进程ID 进程的唯一标识符 USER 进程所有者 运行该进程的用户 PR 优先级 内核调度优先级(数字越小越优先) NI Nice值 用户可调整的优先级(-20最高,19最低) VIRT 虚拟内存 进程申请的虚拟内存总量(包括未分配的) RES 常驻内存 实际占用的物理内存(关键指标) SHR 共享内存 与其他进程共享的内存 S 进程状态 R=运行,S=睡眠,D=不可中断睡眠,Z=僵尸,T=停止 %CPU CPU使用率 占单个CPU的百分比(可超过100%,表示多线程) %MEM 内存使用率 占物理内存的百分比 TIME+ 累计CPU时间 进程启动以来占用的总CPU时间(分钟:秒.百分秒) COMMAND 命令名/命令行 启动进程的命令(按 c可切换显示完整命令行)- 交互快捷键(重点):
- P:按 CPU 占用排序(默认)。
- M:按内存占用排序(排查内存泄露神器)。
- N:按 PID 排序。
- k:直接输入 PID 杀掉进程(不用退出 top)。
- q:退出。
- 【top 命令 应用实例】
- 找出最吃内存的程序:打开 top 后按大写 M,发现某个 Java 程序内存飙升,从而定位内存溢出问题。
- 监控指定用户:top -u cyan,只看 cyan 用户名下的进程运行情况。
- 调整刷新频率:top -d 1(每秒刷新一次),在观察瞬时性能抖动时非常有用。
二、系统监控
1.磁盘情况查询:
如果我们想知道某个目录到底占了多少空间,df(查看整体文件系统)就不够用了,这时候需要 du (Disk Usage) 命令,具体用法如下:
du [参数] [目录/文件]du 命令的 常见参数 如下:
- -h:以易读的方式显示(显示 KB, MB, GB)。
- -s:只显示总计(Summary),不列出子目录的细节。
- -a:列出所有文件和目录的占用大小。
- --max-depth=1:只查看当前目录下一级的子目录大小,避免递归太深。
eg: du -sh /home/cyan —— 快速查看 cyan 用户目录的总大小。
2.磁盘挂载 基本介绍:
① 什么是磁盘挂载?
在 Linux 中,一切皆文件。无论你物理上有几个硬盘或分区,它们最终都要归结到根目录 / 下。
- 原理:Linux 采用“接入”的处理方法。一个独立的磁盘分区必须关联到一个现有的目录,这个目录就是该分区的“入口”。
- 理解:我们可以把挂载目录想象成硬盘在系统里的“大门”。不挂载,你就找不到这扇门,也就没法往硬盘里存东西。
② 如果我们新买了一块硬盘装在服务器上,那么完成挂载通常需要以下 5 步:
- 添加硬盘:在硬件层面或虚拟机设置中增加磁盘。
- 分区:使用 fdisk 等工具给硬盘划分区域。
- 格式化:使用 mkfs 命令给分区创建文件系统(例如 ext4 或 xfs)。
- 挂载:使用 mount 命令将分区与目录关联。
- 设置自动挂载:修改配置文件,让机器重启后依然生效。
PS:如直接用命令行挂载的方式,重启之后会失效!因为使用 mount 命令进行的挂载是临时的。一旦系统重启,挂载关系就会丢失,目录又会变回空的。所以才需要修改 /etc/fstab 配置文件。在这个文件里登记分区的 UUID 或 设备名,系统在开机时就会自动按照配置进行挂载。
3.磁盘分类:
① 硬盘分类说明
Linux 里的硬盘命名是有规律的,区别不同的硬盘主要看的是驱动器标识:
- IDE 硬盘:驱动器标识符为 hdX~。其中 hd 是类型,“x”是盘号(a为基本主盘,b为基本从盘...),“~”是分区号(1-4为主分区或扩展分区,5开始是逻辑分区)。
- SCSI/SATA 硬盘(目前主流):标识符为 sdX~。其命名逻辑与 IDE 硬盘一致,只是前缀变成了 sd。例如:sda1 表示第一个 SCSI 硬盘的第一个分区。
② 查询指令
- lsblk:用于查看当前系统的磁盘结构(List Block Devices),它可以快速查看系统有哪些硬盘、分区,以及它们的挂载关系(设备视角)
具体输出的每一行的含义 如下表所示:
列名 含义 NAME 设备名称(如 sda 表示第一块硬盘,sda1 表示第一个分区) MAJ:MIN 主设备号:次设备号(内核识别设备的编号) RM 是否可移除设备(1=可移除,如U盘;0=固定硬盘) SIZE 设备容量 RO 是否只读(1=只读,0=可读写) TYPE 设备类型(disk=磁盘,part=分区,rom=光驱,lvm=逻辑卷) MOUNTPOINT 挂载点(设备当前挂载在哪个目录
- lsblk -f:此处的 “ -f ” = filesystem(显示文件系统信息)。即在上述基础上,额外显示文件系统类型(FSTYPE)、磁盘的唯一标识符(UUID)、卷标(文件系统视角)。
具体新增的三个列的含义 如下表所示:
列名 含义 FSTYPE 文件系统类型(ext4=Linux常用,vfat=FAT32,ntfs=Windows,swap=交换分区) LABEL 卷标(给分区起的名字,如 "Ubuntu"、"USBDRIVE") UUID 全局唯一标识符(系统用来识别分区的唯一ID,比设备名更可靠
4.磁盘挂载 现实案例:
链接如下:
Linux 远程Ubuntu服务器扩展硬盘后,将/home目录移动到新的硬盘空间上(把新硬盘的分区挂载到/home目录) 教程_ubuntu将home挂到别的硬盘-CSDN博客
https://cyan-ra9.blog.csdn.net/article/details/153582564?spm=1001.2014.3001.5502 在这篇博文中,up对一个远程Ubuntu的服务器实现了扩容,具体来说,就是将新磁盘的分区挂载到了“新的” /home 目录,这样原来的 /home 目录 就可以删去来腾出更多的高速可用空间。具体内容如下——
1)对新硬盘进行分区2)格式化新分区为ext4系统
3)进行数据迁移
4)更改系统配置以使用新的 /home 分区
5)重启后的二次验证
5.磁盘相关 实用指令:
案例一 —— 统计 /opt 文件夹下文件的个数
ls -l /opt | grep "^-" | wc -l解读:
ls -l /opt:以长格式列出 /opt 目录下的内容。每行代表一个文件或目录。
文件行的开头是 -(如 -rw-r--r--)
目录行的开头是 d(如 drwxr-xr-x)
grep
"^-":过滤出以-开头的行,即只保留文件。wc -l:统计行数。
结果:输出 /opt 目录下(仅当前目录,不包括子目录)的文件数量。
案例二 —— 统计 /opt 文件夹下目录的个数
ls -l /opt | grep "^d" | wc -l解读:
和上一个案例的命令几乎一样,只是grep的条件改为
"^d",过滤出以 d 开头的行,即只保留目录。结果:输出 /opt 目录下(仅当前目录,不包括子目录)的子目录数量。
案例三 —— 统计 /opt 文件夹下文件的个数,包括子文件夹里的
ls -lR /opt | grep "^-" | wc -l解读:
ls -lR /opt:-R 表示 递归(Recursive),会列出 /opt 及其所有子目录下的全部内容。
grep "^-":依然过滤出文件行。
wc -l:统计总数。
结果:输出 /opt 目录下包括所有子目录在内的所有文件的总数。
案例四 —— 统计 /opt 文件夹下目录的个数,包括子文件夹里的
ls -lR /opt | grep "^d" | wc -l解读:
同理,ls -lR 会 递归 列出所有内容,grep "^d" 则负责过滤出 目录行。
结果:输出 /opt 目录下包括所有子目录在内的所有子目录的总数(Δ注意:这里统计的是“目录”本身,而不是目录里的文件)。
案例五 —— 以树状显示目录结构
tree 目录解读:
tree:一个专门用来以 树形结构 直观显示目录内容的命令。
目录:要查看的目录路径,如 tree /opt。
安装方法(如果系统没有该命令):
# CentOS/RHEL yum install tree # Ubuntu/Debian apt install tree
6.监控网络状态:
netstat 是 Linux 中网络状态查看的经典命令(network statistics),用于显示网络连接、路由表、接口统计等信息。
常用命令如下所示:
# 查看所有网络连接(最常用) netstat -anp # 查看监听端口(哪些服务在运行) netstat -lnp # 查看特定端口 netstat -anp | grep 80具体参数含义,如下表所示:
netstat -anp 命令的常见状态码含义(TCP连接状态),如下表所示:
参数 含义 说明 -a all 显示所有连接(包括监听的和已建立的) -n numeric 不解析域名和端口名(直接显示IP和数字端口,速度更快) -p program 显示进程PID和程序名(最常用,需root权限) -l listening 只显示监听的端口 -t tcp 只显示TCP连接 -u udp 只显示UDP连接 -r route 显示路由表 -i interfaces 显示网卡接口统计 -s statistics 显示各协议统计信息
状态 含义 LISTEN 监听状态(服务等待连接) ESTABLISHED 已建立连接(正常通信) TIME_WAIT 主动关闭后等待(正常) CLOSE_WAIT 被动关闭等待(程序未正常close) SYN_SENT 正在尝试连接
Δ总结
- 🆗,以上就是本篇博文的全部内容了,感谢阅读!
- 文章共分为了 “进程管理” 和 “系统监控” 两大部分,这两部分都挺重要的,进程管理部分要掌握 ps 命令的使用,以及 Service 管理的一些策略(尤其是 systemctl 命令)
- 关于Linux的博文,短期内(1~2年)应该是不会更了,后面还是专注于写写Java的博文吧。
System.out.println("END------------------------------");
更多推荐









所有评论(0)