目录

Δ前言

一、进程管理

        1.什么是进程:

        2.ps命令 和 pstree 命令 详解:

        3.父子进程:

        4.如何终止运行中的进程?

        5.Service管理:

                5.1 Linux中的服务(Service)是什么?服务管理呢?

                5.2 service管理指令

                5.3 如何查看Linux中的服务名?

                5.4 chkconfig指令 详解

                5.5 systemctl指令 详解

                5.6 firewall指令 详解

                5.7 top命令 详解

二、系统监控

        1.磁盘情况查询:

        2.磁盘挂载 基本介绍:

        3.磁盘分类:

        4.磁盘挂载 现实案例:

        5.磁盘相关 实用指令:

        6.监控网络状态:

Δ总结


Δ前言

  • 大家好,这篇博文主要给大家带来 Linux 进程管理和系统监控的内容分享,和上一篇博文(用户组管理和权限控制)类似,这篇博文其实也算作是 “Linux 常见实用命令汇总及实战演示-CSDN博客” 一文的补充和完善,因为内容太多了不能放一篇里面。
  • 本篇博文共分为两大部分:“一、进程管理” 和 “二、系统监控”。因为命令比较多,有些命令没有附上运行截图,后面还会陆续补充完善。

一、进程管理

        1.什么是进程:

  1. 在 Linux 中,进程(Process) 是指计算机中已运行的程序的实体。通常我们可以理解为:程序是静止的代码(是死死的),而进程是这些代码在内存中跑起来的状态(是活活的)。
  2. 在 Linux 中,根据进程(Process)的执行方式,进程又可细分为 前台进程 和 后台进程,如下——
    1. (1) 前台进程:指那些在终端屏幕上运行,且运行过程中会占据使用者的 命令行窗口,让用户无法输入其他命令的进程。
    2. (2) 后台进程:指那些在后台默默运行,不占用当前终端窗口,你可以一边让它跑着,一边继续在命令行干别的事。
  3. 服务与进程的关系服务(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。

  1. kill [PID]:向进程发送终止信号。
  2. kill -9 [PID]:强制杀死进程(-9 为强制信号)。
  3. killall [进程名]:按照名字批量杀死。

② 实用案例:

  1. 清理假死的 Java 应用: 当某个 Tomcat 或 SpringBoot 应用占着内存不释放且无法响应请求,然后我们通过 ps 查到 PID 为 8888 后: kill -9 8888 这是运维中最常见的 “重启大法” 第一步。

  2. 停止异常的数据库备份任务: 由于磁盘空间不足,一个 mysqldump 备份进程卡住了。此时直接按 Ctrl+C 也触发不了元素反应: killall mysqldump 批量清理所有备份进程,防止磁盘被填满。

  3. 踢掉非法登录的 SSH 用户: 通过 ps -aux 发现某个不认识的 IP 通过 SSH 登录了你的服务器。找到该 sshd 进程对应的 PID: kill 12345 直接中断对方的连接会话。

  4. 强制关停占用端口的 Python 爬虫: 如果发现写错死循环的爬虫脚本正在疯狂抓取数据并占用了 8080 端口,导致其他程序起不来: kill -9 [脚本PID] 快速释放端口资源,修复开发环境。

        5.Service管理:

                5.1 Linux中的服务(Service)是什么?服务管理呢?

  1. 什么是服务:我们在上文 “什么是进程” 中已经提到,服务(Service)本质上是常驻在后台的守护进程(Daemon)。它们在后台默默地听候指令,比如 sshd 服务负责远程连接,httpd 服务负责处理网页请求。
  2. 什么是服务管理:指的是对这些进程进行状态控制(启动、停止、重启)以及对它们的生命周期进行配置(开机是否自启、崩溃是否自动拉起等)。

                5.2 service管理指令

        service 是早期的管理工具,主要用于 CentOS 6 等旧版本

        基本语法service 服务名 [start | stop | restart | reload | status]

        现状说明:虽然在 CentOS 7+ 版本中,大部分 service 指令会自动重定向到 systemctl,但它已经成为时代的眼泪。了解它主要是为了维护一些老旧的脚本或老系统,正常情况下的使用,肯定还是要用 systemctl

                5.3 如何查看Linux中的服务名?

        查找服务名是实现服务管理的前提,通常有两种主流方式:

  1. 旧式方式(脚本查看): 查看 /etc/init.d/ 目录下的脚本,这些通常是传统 SysV 风格的服务脚本。 ls /etc/init.d/ 运行结果示意图如下:

  2. 新式方式(Systemd 查看): 查看被 systemd 管理的所有单元文件: systemctl list-unit-files --type=service (这能让你看到哪些服务已安装,以及它们是否被设置为开机启动). 运行结果示意图如下:

                5.4 chkconfig指令 详解

        chkconfig 用于管理服务在不同运行级别(Runlevel)下的自启动状态。

        常用案例:

  1. 查看所有服务的自启动配置:chkconfig --list
  2. 设置网络服务在 3 和 5 级别下自启动:chkconfig --level 35 network on
  3. 关闭防火墙的开机自启(旧版):chkconfig iptables off

                5.5 systemctl指令 详解

        systemctl 命令 是现代 Linux(Systemd 机制)的权力中心,它合并了以往 service 和 chkconfig 的功能,且功能更牛逼。

  1. 基本语法systemctl [动作] [服务名]

  2. 运行状态控制(即时生效,重启失效): (以 Linux 中最常用的防火墙服务 firewalld 为例)
    1. 启动服务:systemctl start firewalld
    2. 停止服务:systemctl stop firewalld
    3. 重启服务(先停再启,常用于修改配置后):systemctl restart firewalld
    4. 重新加载配置(不停止服务,仅使新配置生效):systemctl reload firewalld
    5. 查看服务详情(可以看到服务是否在运行、PID、报错日志):systemctl status firewalld
  3. 自启动控制永久生效,决定开机后的状态):(以 Linux 中最常用的防火墙服务 firewalld 为例)

    1. 设置开机自启: systemctl enable firewalld

    2. 取消开机自启: systemctl disable firewalld

    3. 检查服务是否设置了自启动:systemctl is-enabled firewalld

    4. 查看服务是否处于激活状态(返回 active 或 inactive):systemctl is-active firewalld

  4. Δ实战案例:【故障排查与自定义服务】

  • 案例 1:当 Nginx 启动失败时的全深度排查, 如果我们执行 systemctl start nginx 报错,常规做法是:

    1. 执行 systemctl status nginx -l:-l 参数会显示完整的报错详情,不会截断。
    2. 如果 status 信息不够,配合 journalctl -u nginx.service 查看内核及系统层面的详细启动日志。
  • 案例 2:将自己的 Python 脚本打包成系统服务 ,假设我们写了一个 my_api.py,并且希望它像服务一样开机自启、死后自动重启:

    1. 在 /etc/systemd/system/ 下新建 my_api.service。
    2. 写入 ExecStart=/usr/bin/python3 /path/to/my_api.py。
    3. 写入 Restart=always:这意味着如果我们的程序崩了,系统会在 5 秒内自动帮你拉起来。
    4. 最后执行 systemctl daemon-reload 和 systemctl enable --now my_api。 

                5.6 firewall指令 详解

        在 CentOS 7+ 中,我们使用 firewall-cmd 来管理防火墙。

  1. 常用操作
    • firewall-cmd --state:查看状态。
    • firewall-cmd --list-all:查看当前放行的所有端口。
    • firewall-cmd --reload:重新加载(修改配置后必须执行)。
  2. 案例场景:假设我们新部署了一个 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 命令的运行示意图如下所示:

  1. top 命令的显示内容说明
    • load average:系统的负载情况(1, 5, 15 分钟),如果数值超过了 CPU 核心数,说明系统很累。
    • %Cpu(s):查看 CPU 是否被某个进程榨干。
    • MiB Mem:内存剩余及使用情况。
    • MiB Swap: 交换分区状态
  2. 进程列表的各个 字段 解析,如下表所示:
    字段 含义 详细说明
    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可切换显示完整命令行)
  3. 交互快捷键(重点)
    • P:按 CPU 占用排序(默认)。
    • M:按内存占用排序(排查内存泄露神器)。
    • N:按 PID 排序。
    • k:直接输入 PID 杀掉进程(不用退出 top)。
    • q:退出。
  4. 【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 步:

  1. 添加硬盘:在硬件层面或虚拟机设置中增加磁盘。
  2. 分区:使用 fdisk 等工具给硬盘划分区域。
  3. 格式化:使用 mkfs 命令给分区创建文件系统(例如 ext4 或 xfs)。
  4. 挂载:使用 mount 命令将分区与目录关联。
  5. 设置自动挂载:修改配置文件,让机器重启后依然生效。

        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

        解读:

  1. ls -l /opt:以长格式列出 /opt 目录下的内容。每行代表一个文件或目录。

    • 文件行的开头是 -(如 -rw-r--r--)

    • 目录行的开头是 d(如 drwxr-xr-x)

  2. grep "^-":过滤出以 - 开头的行,即只保留文件

  3. wc -l:统计行数。

        结果:输出 /opt 目录下(仅当前目录,不包括子目录)的文件数量


        案例二 —— 统计 /opt 文件夹下目录的个数

ls -l /opt | grep "^d" | wc -l

        解读:

  • 和上一个案例的命令几乎一样,只是grep的条件改为 "^d",过滤出以 d 开头的行,即只保留目录

        结果:输出 /opt 目录下(仅当前目录,不包括子目录)的子目录数量


        案例三 —— 统计 /opt 文件夹下文件的个数,包括子文件夹里的

ls -lR /opt | grep "^-" | wc -l

        解读:

  1. ls -lR /opt:-R 表示 递归(Recursive),会列出 /opt 及其所有子目录下的全部内容。

  2. grep "^-":依然过滤出文件行。

  3. wc -l:统计总数。

        结果:输出 /opt 目录下包括所有子目录在内所有文件的总数。


        案例四 —— 统计 /opt 文件夹下目录的个数,包括子文件夹里的 

ls -lR /opt | grep "^d" | wc -l

        解读:

  • 同理,ls -lR 会 递归 列出所有内容,grep "^d" 则负责过滤出 目录行。

        结果:输出 /opt 目录下包括所有子目录在内所有子目录的总数(Δ注意:这里统计的是“目录”本身,而不是目录里的文件)。


        案例五 —— 以树状显示目录结构 

tree 目录

        解读:

  1. tree:一个专门用来以 树形结构 直观显示目录内容的命令。

  2. 目录:要查看的目录路径,如 tree /opt

  3. 安装方法(如果系统没有该命令):

    # CentOS/RHEL
    yum install tree
    
    # Ubuntu/Debian
    apt install tree

        6.监控网络状态:

        netstat 是 Linux 中网络状态查看的经典命令(network statistics),用于显示网络连接、路由表、接口统计等信息。

        常用命令如下所示:

# 查看所有网络连接(最常用)
netstat -anp

# 查看监听端口(哪些服务在运行)
netstat -lnp

# 查看特定端口
netstat -anp | grep 80

        具体参数含义,如下表所示:

参数 含义 说明
-a all 显示所有连接(包括监听的和已建立的)
-n numeric 不解析域名和端口名(直接显示IP和数字端口,速度更快)
-p program 显示进程PID和程序名(最常用,需root权限
-l listening 只显示监听的端口
-t tcp 只显示TCP连接
-u udp 只显示UDP连接
-r route 显示路由表
-i interfaces 显示网卡接口统计
-s statistics 显示各协议统计信息
         netstat -anp 命令的常见状态码含义(TCP连接状态),如下表所示:
状态 含义
LISTEN 监听状态(服务等待连接)
ESTABLISHED 已建立连接(正常通信)
TIME_WAIT 主动关闭后等待(正常)
CLOSE_WAIT 被动关闭等待(程序未正常close)
SYN_SENT 正在尝试连接

Δ总结

  • 🆗,以上就是本篇博文的全部内容了,感谢阅读!
  • 文章共分为了 “进程管理” 和 “系统监控” 两大部分,这两部分都挺重要的,进程管理部分要掌握 ps 命令的使用,以及 Service 管理的一些策略(尤其是 systemctl 命令)
  • 关于Linux的博文,短期内(1~2年)应该是不会更了,后面还是专注于写写Java的博文吧。

        System.out.println("END------------------------------");

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐