一、RAID 是什么?​

RAID(独立磁盘冗余阵列)是通过将多块独立磁盘组合为逻辑存储单元的技术,核心解决单盘性能瓶颈与单点故障问题,实现性能提升、容量扩展、数据冗余三大目标。它通过条带化、镜像、校验等算法,在存储性能与数据安全间找到平衡,是服务器存储架构的核心技术。​

二、RAID 的核心作用与级别解析​

1. 核心作用​

  • 性能提升:多盘并行读写突破单盘 I/O 限制;​
  • 数据冗余:通过镜像或校验实现磁盘故障时的数据保护;​
  • 容量扩展:将多盘存储空间整合为统一逻辑卷。​

2. 主流 RAID 级别详解​

级别​

最少磁盘​

磁盘利用率​

核心原理​

优点​

缺点​

RAID 0​

2​

100%​

条带化:数据分块分散存储​

读写性能极致(N 倍单盘速度)​

无容错,单盘故障数据全失​

RAID 1​

2(偶数)​

50%​

镜像:数据同步复制到双盘​

高可靠性,支持单盘故障​

写性能低,存储成本高​

RAID 5​

≥3​

(N-1)/N​

分布式校验:数据 + 校验分散存储​

兼顾性能与冗余,利用率高​

写性能受校验计算拖累​

RAID 10​

≥4(偶数)​

50%​

先镜像后条带:RAID1 组再做 RAID0​

性能与可靠性双优,重建快​

成本最高,利用率低​

数据来源:CSDN 技术博客实测总结​

三、RAID 级别典型应用场景​

根据业务需求匹配 RAID 级别是关键,以下为高频场景推荐:​

  1. RAID 0:视频渲染缓存、游戏加载盘等性能优先且数据非关键场景,依赖外部备份兜底;​
  1. RAID 1:财务系统、日志服务器等数据安全至上场景,单盘故障不影响业务连续性;​
  1. RAID 5:中小企业文件服务器、视频点播平台等读多写少场景,平衡成本与冗余;​
  1. RAID 10:高负载数据库、虚拟化平台等性能与安全双高场景,如电商核心交易系统。​

四、RAID 0/1/5/10 实战配置

前置条件

  • 管理员身份运行 PowerShell;
  • 虚拟机已添加 4 块虚拟磁盘(识别为PhysicalDisk 1-4,可通过Get-PhysicalDisk查看);
  • 所有磁盘未分区,状态为 “未初始化”。
1. 通用初始化:磁盘分区与动态磁盘转换
# 1. 查看所有物理磁盘,确认目标磁盘编号(示例:磁盘1-4对应Number 1-4)

Get-PhysicalDisk | Select-Object Number, FriendlyName, Size, MediaType

# 2. 初始化磁盘(GPT分区表,适用于大容量磁盘)

$diskNumbers = 1,2,3,4 # 目标磁盘编号,根据实际情况修改

foreach ($num in $diskNumbers) {

Initialize-Disk -Number $num -PartitionStyle GPT -PassThru

}

# 3. 将磁盘转换为动态磁盘(RAID配置必需)

Get-Disk -Number $diskNumbers | Set-Disk -IsDynamic $true

2. RAID 0(带区卷)创建代码
# 1. 为磁盘1-2创建卷(RAID 0需2块盘)

$raid0Disks = Get-Disk -Number 1,2 | Get-Partition | Where-Object PartitionNumber -eq 1

New-Volume -Disk $raid0Disks -FriendlyName "RAID0_Volume" -DriveLetter F `

-FileSystem NTFS -AllocationUnitSize 65536 -Type Striped # Striped=RAID 0

# 2. 验证RAID 0配置

Get-Volume -DriveLetter F | Select-Object DriveLetter, FriendlyName, Size, FileSystem

Get-PhysicalDisk -VirtualDisk (Get-VirtualDisk -FriendlyName "RAID0_Volume") # 查看成员盘

3. RAID 1(镜像卷)创建代码
# 1. 为磁盘3-4创建镜像卷(RAID 1需2块盘)

$raid1Disks = Get-Disk -Number 3,4 | Get-Partition | Where-Object PartitionNumber -eq 1

New-Volume -Disk $raid1Disks -FriendlyName "RAID1_Volume" -DriveLetter G `

-FileSystem NTFS -AllocationUnitSize 65536 -Type Mirrored # Mirrored=RAID 1

# 2. 添加热备盘(可选,用磁盘5作为热备,需额外添加虚拟磁盘)

# Get-Disk -Number 5 | Set-PhysicalDisk -Usage HotSpare -VirtualDisk (Get-VirtualDisk -FriendlyName "RAID1_Volume")

# 3. 验证RAID 1配置

Get-VirtualDisk -FriendlyName "RAID1_Volume" | Select-Object FriendlyName, ResiliencySettingName, Size

4. RAID 5 创建代码
# 1. 删除现有卷(若复用磁盘1-3,需先清理)

Get-Volume -DriveLetter F | Remove-Volume -Confirm:$false

Get-Partition -DiskNumber 1,2,3 | Remove-Partition -Confirm:$false

# 2. 重新创建分区并创建RAID 5(需3块盘)

$raid5Disks = Get-Disk -Number 1,2,3 | ForEach-Object {

New-Partition -DiskNumber $_.Number -UseMaximumSize -AssignDriveLetter:$false

}

New-Volume -Disk $raid5Disks -FriendlyName "RAID5_Volume" -DriveLetter H `

-FileSystem NTFS -AllocationUnitSize 65536 -Type RAID5 # Type=RAID5

# 3. 验证RAID 5配置(查看校验信息与容量)

Get-VirtualDisk -FriendlyName "RAID5_Volume" | Format-Table FriendlyName, ResiliencySettingName, Size, AllocatedSize

5. RAID 10 创建代码
# 1. 清理磁盘1-4分区(确保无现有卷)

Get-Partition -DiskNumber 1,2,3,4 | Remove-Partition -Confirm:$false

# 2. 步骤1:创建2组镜像卷(磁盘1+2,磁盘3+4)

$mirror1 = New-VirtualDisk -FriendlyName "Mirror1" -StoragePoolFriendlyName "Primordial" `

-PhysicalDisk (Get-PhysicalDisk -Number 1,2) -Size 20GB -ResiliencySettingName Mirror

$mirror2 = New-VirtualDisk -FriendlyName "Mirror2" -StoragePoolFriendlyName "Primordial" `

-PhysicalDisk (Get-PhysicalDisk -Number 3,4) -Size 20GB -ResiliencySettingName Mirror

# 3. 步骤2:将2组镜像卷创建为带区卷(组成RAID 10)

$raid10Disks = $mirror1, $mirror2 | Get-Disk

New-Volume -Disk $raid10Disks -FriendlyName "RAID10_Volume" -DriveLetter I `

-FileSystem NTFS -AllocationUnitSize 65536 -Type Striped

# 4. 验证RAID 10架构

Get-VirtualDisk -FriendlyName "RAID10_Volume" | Select-Object FriendlyName, ResiliencySettingName, PhysicalDiskNames

五、Linux 虚拟机(mdadm 工具代码实现,以 CentOS 8 为例)

前置条件
  • 虚拟机添加 4 块虚拟磁盘(识别为/dev/sdb, /dev/sdc, /dev/sdd, /dev/sde);
  • 安装 mdadm 工具:yum install mdadm -y。
1. RAID 0 创建与验证
# 1. 创建RAID 0(设备名/dev/md0,成员盘sdb、sdc)

mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc

# 2. 格式化并挂载(ext4文件系统,挂载点/mnt/raid0)

mkfs.ext4 /dev/md0

mkdir -p /mnt/raid0

mount /dev/md0 /mnt/raid0

# 3. 配置开机自动挂载(添加到/etc/fstab)

echo "/dev/md0 /mnt/raid0 ext4 defaults 0 0" >> /etc/fstab

# 4. 验证RAID 0状态

mdadm --detail /dev/md0

cat /proc/mdstat # 查看实时RAID状态

2. RAID 1 创建与验证
# 1. 创建RAID 1(设备名/dev/md1,成员盘sdb、sdc,添加热备盘sde)

mdadm --create /dev/md1 --level=1 --raid-devices=2 --spare-devices=1 /dev/sdb /dev/sdc /dev/sde

# 2. 格式化挂载(ext4,挂载点/mnt/raid1)

mkfs.ext4 /dev/md1

mkdir -p /mnt/raid1

mount /dev/md1 /mnt/raid1

echo "/dev/md1 /mnt/raid1 ext4 defaults 0 0" >> /etc/fstab

# 3. 验证RAID 1(查看热备盘状态)

mdadm --detail /dev/md1 # 热备盘显示为"spare"

3. RAID 5 创建与故障恢复
# 1. 创建RAID 5(设备名/dev/md2,成员盘sdb、sdc、sdd,预留sde为热备)

mdadm --create /dev/md2 --level=5 --raid-devices=3 --spare-devices=1 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# 2. 格式化挂载(ext4,挂载点/mnt/raid5)

mkfs.ext4 /dev/md2

mkdir -p /mnt/raid5

mount /dev/md2 /mnt/raid5

echo "/dev/md2 /mnt/raid5 ext4 defaults 0 0" >> /etc/fstab

# 3. 模拟磁盘故障(标记sdb为故障)

mdadm /dev/md2 --fail /dev/sdb

# 4. 移除故障盘并恢复(热备盘sde自动替换,无需手动添加)

mdadm /dev/md2 --remove /dev/sdb

mdadm --detail /dev/md2 # 查看恢复进度

4. RAID 10 创建与验证
# 1. 创建RAID 10(设备名/dev/md3,成员盘sdb、sdc、sdd、sde,分组:sdb+sdc为镜像,sdd+sde为镜像)

mdadm --create /dev/md3 --level=10 --raid-devices=4 --layout=f2 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# --layout=f2:表示先镜像后带区(符合RAID 10标准架构)

# 2. 格式化挂载(ext4,挂载点/mnt/raid10)

mkfs.ext4 /dev/md3

mkdir -p /mnt/raid10

mount /dev/md3 /mnt/raid10

echo "/dev/md3 /mnt/raid10 ext4 defaults 0 0" >> /etc/fstab

# 3. 验证RAID 10架构(查看分组信息)

mdadm --detail /dev/md3 | grep -E "Raid Level|Array Size|Raid Devices"

六、代码使用注意事项

  1. 磁盘路径确认:Windows 中通过Get-PhysicalDisk、Linux 中通过lsblk确认磁盘编号 / 路径,避免误操作系统盘(如 Windows 的C:、Linux 的/dev/sda);
  1. 数据备份:代码执行前需清空目标磁盘数据,若有重要文件需提前备份;
  1. 权限要求:Windows 需管理员 PowerShell,Linux 需root用户(或加sudo);
  1. 故障模拟:Linux 的mdadm --fail仅用于测试,生产环境需谨慎,恢复后需重新添加新磁盘作为热备。

七、Linux 系统引导过程

Linux 引导过程本质是 “硬件自检→加载引导器→启动内核→初始化系统→进入用户环境” 的递进过程,不同发行版(如 CentOS、Ubuntu、Debian)流程一致,仅部分配置文件路径有细微差异(下文以 CentOS 8 为例)。​

1. 阶段 1:POST 硬件自检(Power-On Self Test)​

  • 作用:计算机开机后,BIOS/UEFI 首先执行硬件自检,检查 CPU、内存、磁盘、显卡等硬件是否正常。​
  • 关键细节:​
  • 若硬件故障(如内存松动),会通过蜂鸣器报警或屏幕提示(如 “Memory Error”);​
  • 自检通过后,BIOS/UEFI 会读取 “启动顺序”(可在开机时按Del/F2进入设置),优先从硬盘 / U 盘等设备加载引导程序。​

2. 阶段 2:MBR/GPT 引导(引导扇区加载)​

根据磁盘分区表类型,分为传统 MBR 引导和 UEFI 模式下的 GPT 引导:​

引导模式​

核心组件​

支持磁盘容量​

关键路径​

MBR(传统)​

主引导记录(MBR,位于磁盘 0 扇区)​

最大 2TB​

/boot/grub2/grub.cfg(GRUB2 配置)​

GPT(UEFI)​

EFI 系统分区(ESP,格式为 FAT32)​

无上限​

/boot/efi/EFI/centos/grub.cfg​

  • 实战场景:若 MBR 损坏导致无法引导,可通过 CentOS 救援模式修复:​

# 进入救援模式后,执行MBR修复(假设系统盘为/dev/sda)​

grub2-install /dev/sda​

# 重建GRUB配置文件​

grub2-mkconfig -o /boot/grub2/grub.cfg​

3. 阶段 3:GRUB2 引导加载器(内核与 initramfs 加载)​

GRUB2(Grand Unified Bootloader 2)是 Linux 默认引导器,负责加载内核和临时根文件系统:​

  1. 显示引导菜单:开机后默认显示 GRUB 菜单(超时时间可在/etc/default/grub中修改GRUB_TIMEOUT);​
  1. 加载内核(vmlinuz):内核文件位于/boot/vmlinuz-$(uname -r),是系统的核心,负责管理硬件资源;​
  1. 加载临时根文件系统(initramfs):文件位于/boot/initramfs-$(uname -r).img,包含内核启动所需的驱动(如磁盘驱动),确保内核能识别并挂载真正的根文件系统(/)。​
  • 应急操作:若 initramfs 损坏,可重建:​

​dracut -f /boot/initramfs-$(uname -r).img $(uname -r)​

​4. 阶段 4:内核初始化(挂载根文件系统)​

内核完成以下操作后,将启动第一个用户空间进程(/sbin/init,即 Systemd 的进程号 1):​

  1. 检测并初始化硬件设备(如 CPU、内存、网卡);​
  1. 挂载/etc/fstab中定义的根文件系统(如/dev/mapper/cl-root);​
  1. 执行/sbin/init,将系统控制权交给 Systemd。​

5. 阶段 5:Systemd 初始化(启动服务与用户环境)​

Systemd 作为现代 Linux 的初始化系统(替代传统 SysVinit),通过 “目标(target)” 和 “单元(unit)” 管理系统启动:​

  1. 启动默认 target:默认 target 为multi-user.target(字符界面)或graphical.target(图形界面),可通过systemctl get-default查看;​
  1. 激活依赖服务:根据 target 的依赖关系,启动核心服务(如sshd、network、firewalld);​
  1. 进入用户环境:服务启动完成后,显示登录界面(字符或图形),引导过程结束。​

八、Systemd 服务管理

Systemd 通过 “单元(unit)” 管理系统资源,其中 “服务单元(.service)” 是最常用的类型(如nginx.service、mysql.service)。以下是核心操作与实战案例。​

1. Systemd 核心概念快速理解​

  • 单元(Unit):Systemd 管理的最小单位,包括服务(.service)、目标(.target)、挂载(.mount)等,可通过systemctl list-units查看已激活单元;​
  • 目标(Target):类似传统 SysVinit 的 “运行级别”,用于分组服务(如multi-user.target对应运行级别 3,graphical.target对应运行级别 5);​
  • 依赖关系:服务间的依赖(如nginx.service依赖network.target),在服务配置文件中定义。​

2. 服务管理基础命令(必背)​

以nginx.service为例,掌握以下命令可应对 90% 的日常场景:​

功能需求​

命令​

说明​

启动服务​

systemctl start nginx​

临时启动,重启后失效​

停止服务​

systemctl stop nginx​

临时停止​

重启服务​

systemctl restart nginx​

适用于配置修改后​

重新加载配置​

systemctl reload nginx​

不中断服务,加载新配置​

设置开机自启​

systemctl enable nginx​

写入/etc/systemd/system/multi-user.target.wants/​

禁用开机自启​

systemctl disable nginx​

移除自启链接​

查看服务状态​

systemctl status nginx​

显示运行状态、日志片段​

查看服务是否自启​

systemctl is-enabled nginx​

返回enabled/disabled​

  • 实战示例:安装并配置 nginx 开机自启:​

​# 安装nginx​

dnf install nginx -y​

# 启动并设置开机自启​

systemctl start nginx && systemctl enable nginx​

# 查看状态(确认Active: active (running))​

systemctl status nginx​

3. 服务配置文件:自定义服务的核心​

Systemd 服务配置文件分为 “系统级” 和 “用户级”,最常用的是系统级(路径:/usr/lib/systemd/system/或/etc/systemd/system/,后者优先级更高)。​

配置文件结构(以自定义backup.service为例)​

​[Unit]​

# 服务描述​

Description=Daily Data Backup Service​

# 依赖的目标(多用户模式启动后才启动)​

After=multi-user.target​

[Service]​

# 服务类型(simple:直接启动命令;forking:后台运行)​

Type=simple​

# 执行的备份命令(假设脚本路径为/opt/backup.sh)​

ExecStart=/bin/bash /opt/backup.sh​

# 服务停止时执行的命令(可选)​

ExecStop=/bin/echo "Backup service stopped"​

# 故障后自动重启(可选,如on-failure:失败时重启)​

Restart=on-failure​

# 重启间隔(可选,单位秒)​

RestartSec=3​

[Install]​

# 服务安装的目标(设置开机自启时,链接到multi-user.target)​

WantedBy=multi-user.target​

配置文件生效步骤​

  1. 编写配置文件并保存到/etc/systemd/system/backup.service;​
  2. 重新加载 Systemd 配置(必须执行,否则不识别新配置):​

​systemctl daemon-reload​

​启动服务并测试:​

​systemctl start backup && systemctl status backup​

  1. (可选)设置开机自启:​

​systemctl enable backup​

​4. Systemd 日志管理:排查服务故障的利器​

Systemd 自带日志系统journald,无需额外安装,可通过journalctl命令查看服务日志,比传统/var/log/日志更集中。​

常用日志查看命令​

功能需求​

命令​

查看 nginx 服务所有日志​

journalctl -u nginx​

查看 nginx 服务最新 10 行日志​

journalctl -u nginx -n 10​

实时跟踪 nginx 日志(类似 tail -f)​

journalctl -u nginx -f​

查看今天的 nginx 日志​

journalctl -u nginx --since today​

查看指定时间范围的日志​

journalctl -u nginx --since "2025-11-07 09:00" --until "2025-11-07 10:00"​

  • 故障排查示例:若 nginx 启动失败,通过日志定位原因:​

​# 查看nginx启动失败的详细日志​

journalctl -u nginx -xe​

# 常见原因:端口被占用(需修改nginx配置的listen端口)、配置文件语法错误(执行nginx -t检查)​

5. Target 管理:切换系统运行模式​

Target 用于管理服务组,常见场景包括切换字符 / 图形界面、进入救援模式:​

需求​

命令​

说明​

查看当前默认 target​

systemctl get-default​

通常为 multi-user.target 或 graphical.target​

设置默认字符界面​

systemctl set-default multi-user.target​

重启后生效​

设置默认图形界面​

systemctl set-default graphical.target​

需安装图形桌面(如 gnome)​

临时进入救援模式​

systemctl isolate rescue.target​

无需重启,需输入 root 密码​

临时进入紧急模式​

systemctl isolate emergency.target​

最小化环境,用于修复严重故障​

九、常见问题与排查技巧​

  1. 引导失败:GRUB 菜单不显示​
  • 原因:/etc/default/grub中GRUB_TIMEOUT设为 0,或 GRUB 配置损坏;​
  • 解决:进入救援模式,修改GRUB_TIMEOUT=5,再执行grub2-mkconfig -o /boot/grub2/grub.cfg。​
  1. 服务启动失败:Active: failed​
  • 步骤 1:用systemctl status 服务名查看状态摘要;​
  • 步骤 2:用journalctl -u 服务名 -xe查看详细日志,定位错误(如脚本路径错误、权限不足)。​
  1. initramfs 损坏:无法挂载根文件系统​
  • 解决:进入救援模式,执行dracut -f /boot/initramfs-$(uname -r).img $(uname -r)重建。

一、进程基础:先搞懂这 3 个核心概念​

在动手操作前,先理清进程的关键属性,避免后续命令 “知其然不知其所以然”。​

1. 进程的核心标识:PID 与 PPID​

  • PID(Process ID):进程唯一编号,系统通过 PID 区分不同进程(如1号进程是systemd,所有进程的 “祖先”);​
  • PPID(Parent PID):父进程编号,标识当前进程由哪个进程创建(如bash终端启动nginx,则nginx的 PPID 是bash的 PID);​
  • 查看方式:通过echo $$查看当前终端的 PID,ps -ef | grep 进程名查看指定进程的 PID/PPID。​

2. 进程的 5 种常见状态(重点区分!)​

进程在生命周期中会处于不同状态,通过ps或top命令可查看,核心状态及含义如下:​

状态标识​

状态名称​

核心含义​

常见场景​

R​

Running/Runnable​

正在运行或等待 CPU 调度​

top中显示的高 CPU 进程​

S​

Interruptible Sleep​

可中断睡眠(等待资源,如磁盘 I/O)​

等待用户输入的bash进程​

D​

Uninterruptible Sleep​

不可中断睡眠(核心资源等待,如磁盘读写)​

磁盘 IO 繁忙时的dd进程​

Z​

Zombie​

僵尸进程(子进程已结束,父进程未回收)​

程序异常退出未清理子进程​

T​

Stopped​

暂停状态(收到停止信号,如Ctrl+Z)​

被kill -19暂停的python脚本​

3. 进程的两类运行模式​

  • 前台进程:依赖终端交互,占用终端输入输出(如ping baidu.com,关闭终端则进程终止);​
  • 后台进程:不依赖终端,在后台运行(如nginx -g "daemon on;",关闭终端仍继续运行);​
  • 切换关键:通过&将前台进程转入后台,通过fg将后台进程调回前台。​

十、进程查看:3 类命令覆盖 90% 场景​

查看进程是管理的第一步 —— 需知道 “系统中有哪些进程”“谁在占用 CPU / 内存”,以下是高频命令的实战用法。​

1. 基础查看:ps(静态快照)​

ps(Process Status)用于获取进程的 “静态快照”,适合一次性查看进程信息,核心选项组合如下:​

(1)查看所有进程:ps aux(最常用)​

# 查看系统所有进程,输出字段包含PID、CPU占用、内存占用等​

ps aux​

关键输出字段解读(重点关注前 8 列):​

字段​

含义​

示例​

USER​

进程所属用户​

root(系统进程)、nginx(应用进程)​

PID​

进程编号​

1234​

%CPU​

进程占用 CPU 百分比​

30.0(高 CPU 进程,需关注)​

%MEM​

进程占用内存百分比​

15.2(高内存进程,需关注)​

VSZ​

虚拟内存大小(KB)​

204800(包含共享库、交换空间)​

RSS​

物理内存大小(KB)​

102400(实际占用的物理内存)​

TTY​

进程关联的终端​

?(后台进程,无终端)、pts/0(远程终端)​

STAT​

进程状态​

R(运行)、S(睡眠)、Z(僵尸)​

(2)查看进程树关系:ps -efH​

# -e:所有进程;-f:显示完整信息;-H:按进程树层级显示(PPID关联)​

ps -efH | grep nginx​

用途:快速查看进程的父子关系(如nginx的主进程与工作进程),示例输出:​

root 1234 1 0 10:00 ? 00:00:00 nginx: master process /usr/sbin/nginx​

nginx 1235 1234 0 10:00 ? 00:00:02 \_ nginx: worker process​

nginx 1236 1234 0 10:00 ? 00:00:02 \_ nginx: worker process​

2. 实时监控:top(动态刷新)​

top是 “动态进程监控工具”,默认每 3 秒刷新一次,适合实时跟踪 CPU、内存占用变化,尤其排查 “资源飙升” 问题。​

(1)top界面核心区域解读​

启动top后,界面分为两部分:​

  • 顶部系统信息区(前 5 行):​
  • 第 1 行:系统时间、运行时长、登录用户数、负载平均值(load average: 0.05, 0.10, 0.08,分别代表 1/5/15 分钟负载,通常不超过 CPU 核心数);​
  • 第 3 行:CPU 占用(us:用户进程占用,sy:系统进程占用,id:空闲 CPU,wa:等待 IO 的 CPU 时间,wa过高说明磁盘 IO 繁忙);​
  • 第 4-5 行:内存 / 交换分区占用(used:已用,free:空闲,buff/cache:缓存区)。​
  • 底部进程列表区:与ps aux类似,默认按 CPU 占用降序排列。​

(2)top交互操作(必记!)​

在top界面中,无需退出即可执行操作,核心快捷键:​

快捷键​

功能​

实战场景​

P​

按 CPU 占用降序排列​

快速找 “CPU 飙升” 的进程​

M​

按内存占用降序排列​

定位 “内存泄漏” 的进程​

N​

按 PID 升序排列​

查找指定 PID 的进程​

k​

终止进程(输入 PID + 信号)​

杀死无响应的进程​

q​

退出top​

-​

实战示例:用top杀死高 CPU 进程:​

  1. 启动top,按P排序,找到 CPU 占用 90% 的进程(PID=5678);​
  1. 按k,输入5678,按回车;​
  1. 输入信号编号(如9,强制终止),按回车,进程被杀死。​

3. 进阶工具:htop与pstree​

top功能基础,htop(增强版)和pstree(进程树)能解决更复杂场景:​

(1)htop:更直观的可视化监控​

htop比top支持鼠标操作、彩色显示,还能批量终止进程,安装与使用:​

# CentOS安装(需EPEL源)​

dnf install epel-release -y && dnf install htop -y​

# Ubuntu安装​

apt install htop -y​

# 启动htop​

htop​

核心优势:​

  • 顶部显示 CPU 核心数(如4 CPU),每个核心的占用单独显示;​
  • 支持鼠标点击 “CPU”“MEM” 列排序;​
  • 按F9可打开 “信号选择框”,直接选择SIGKILL(9)终止进程,无需记信号编号。​

(2)pstree:查看进程树关系​

pstree以树状图显示进程间的父子关系,适合理解 “进程从哪来”:​

# 查看所有进程树,-p显示PID,-u显示所属用户​

pstree -pu​

# 查看指定进程的子进程树(如查看PID=1234的nginx主进程)​

pstree -pu 1234​

示例输出(清晰看到 nginx 主进程与工作进程的关系):​

nginx(1234:root)─┬─nginx(1235:nginx)​

└─nginx(1236:nginx)​

十一、进程控制:启动、暂停、终止的实战操作​

掌握进程的 “生命周期控制”,能应对 “进程无响应”“需后台运行脚本” 等日常场景。​

1. 启动进程:前台与后台的切换​

(1)前台启动(默认)​

直接执行命令,进程占用终端,如:​

# ping百度,前台运行,按Ctrl+C终止​

ping baidu.com​

(2)后台启动:&与nohup​

  • 临时后台:用&将进程转入后台,终端关闭则进程终止:​

# 后台运行ping,输出重定向到/dev/null(避免终端打印)​

ping baidu.com > /dev/null 2>&1 &​

# 查看后台进程(jobs命令)​

jobs​

# 输出:[1]+ Running ping baidu.com > /dev/null 2>&1 &​

  • 持久后台:用nohup(no hangup,不挂断)启动,终端关闭后进程仍运行(适合长期脚本):​

# 后台运行Python脚本,输出保存到nohup.out​

nohup python /opt/data_collect.py &​

# 查看脚本输出​

tail -f nohup.out​

(3)后台转前台:fg​

# 用jobs查看后台进程编号(如[1])​

jobs​

# 将编号1的后台进程调回前台​

fg 1​

2. 终止进程:kill与killall(核心命令)​

终止进程本质是向进程发送 “信号”,不同信号对应不同行为,常用信号如下:​

信号编号​

信号名称​

含义​

实战场景​

1​

SIGHUP​

重新加载配置​

kill -1 1234(重启 nginx,不中断服务)​

9​

SIGKILL​

强制终止(不可忽略)​

杀死无响应的进程(如kill -9 5678)​

15​

SIGTERM​

正常终止(默认信号)​

优雅关闭进程(如kill 1234,给进程清理时间)​

(1)按 PID 终止:kill​

# 正常终止nginx主进程(PID=1234)​

kill 1234​

# 若进程无响应,强制终止​

kill -9 1234​

(2)按进程名终止:killall与pkill​

当不知道 PID 时,用进程名终止(需安装psmisc包):​

十二、进程优先级:调整资源分配的 “权重”​

Linux 系统中,进程优先级决定了 CPU 调度的 “优先顺序”—— 优先级高的进程会优先获得 CPU 时间。通过nice和renice命令可调整优先级。​

1. 优先级的表示:nice 值​

  • nice 值范围:-20(最高优先级)~ 19(最低优先级);​
  • 默认值:新建进程的 nice 值为0;​
  • 核心逻辑:nice 值越小,CPU 调度优先级越高(如-20的进程会 “抢占”19的进程的 CPU 资源)。​

2. 调整优先级的 2 种场景​

(1)启动时设置优先级:nice​

(2)运行中调整优先级:renice​

五、故障排查:3 类常见进程问题的解决​

1. 僵尸进程(Z 状态):如何清理?​

问题原因​

子进程结束后,父进程未调用wait()函数回收子进程资源,导致子进程成为 “僵尸进程”(占用 PID,不占用 CPU / 内存,但 PID 耗尽会导致无法新建进程)。​

排查与解决​

2. CPU 飙升:定位 “罪魁祸首”​

排查步骤​

# 若输出大量重复调用(如频繁读写文件),说明进程逻辑有问题​

# 4. 临时解决:强制终止进程(若确认进程异常)​

kill -9 5678​

3. 内存泄漏:进程内存持续增长​

排查步骤​

# 1. 用top按内存排序(按M),找到内存持续增长的进程(PID=9012)​

top​

# 2. 查看进程的内存占用详情(pmap,显示进程内存映射)​

pmap -x 9012​

# 关注"RSS"列,若持续增长且不释放,说明存在内存泄漏​

# 3. 长期解决:重启进程(临时缓解)+ 修复程序漏洞(根本解决)​

systemctl restart 进程所属服务(如nginx)​

​总结

本文章旨在帮助学习RAID配置事件,系统管理,进程管理。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐