【无标题】
本文章旨在帮助学习RAID配置事件,系统管理,进程管理。
一、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 级别是关键,以下为高频场景推荐:
- RAID 0:视频渲染缓存、游戏加载盘等性能优先且数据非关键场景,依赖外部备份兜底;
- RAID 1:财务系统、日志服务器等数据安全至上场景,单盘故障不影响业务连续性;
- RAID 5:中小企业文件服务器、视频点播平台等读多写少场景,平衡成本与冗余;
- 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"
六、代码使用注意事项
- 磁盘路径确认:Windows 中通过Get-PhysicalDisk、Linux 中通过lsblk确认磁盘编号 / 路径,避免误操作系统盘(如 Windows 的C:、Linux 的/dev/sda);
- 数据备份:代码执行前需清空目标磁盘数据,若有重要文件需提前备份;
- 权限要求:Windows 需管理员 PowerShell,Linux 需root用户(或加sudo);
- 故障模拟: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 默认引导器,负责加载内核和临时根文件系统:
- 显示引导菜单:开机后默认显示 GRUB 菜单(超时时间可在/etc/default/grub中修改GRUB_TIMEOUT);
- 加载内核(vmlinuz):内核文件位于/boot/vmlinuz-$(uname -r),是系统的核心,负责管理硬件资源;
- 加载临时根文件系统(initramfs):文件位于/boot/initramfs-$(uname -r).img,包含内核启动所需的驱动(如磁盘驱动),确保内核能识别并挂载真正的根文件系统(/)。
- 应急操作:若 initramfs 损坏,可重建:
dracut -f /boot/initramfs-$(uname -r).img $(uname -r)
4. 阶段 4:内核初始化(挂载根文件系统)
内核完成以下操作后,将启动第一个用户空间进程(/sbin/init,即 Systemd 的进程号 1):
- 检测并初始化硬件设备(如 CPU、内存、网卡);
- 挂载/etc/fstab中定义的根文件系统(如/dev/mapper/cl-root);
- 执行/sbin/init,将系统控制权交给 Systemd。
5. 阶段 5:Systemd 初始化(启动服务与用户环境)
Systemd 作为现代 Linux 的初始化系统(替代传统 SysVinit),通过 “目标(target)” 和 “单元(unit)” 管理系统启动:
- 启动默认 target:默认 target 为multi-user.target(字符界面)或graphical.target(图形界面),可通过systemctl get-default查看;
- 激活依赖服务:根据 target 的依赖关系,启动核心服务(如sshd、network、firewalld);
- 进入用户环境:服务启动完成后,显示登录界面(字符或图形),引导过程结束。
八、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
配置文件生效步骤
- 编写配置文件并保存到/etc/systemd/system/backup.service;
- 重新加载 Systemd 配置(必须执行,否则不识别新配置):
systemctl daemon-reload
启动服务并测试:
systemctl start backup && systemctl status backup
- (可选)设置开机自启:
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 |
最小化环境,用于修复严重故障 |
九、常见问题与排查技巧
- 引导失败:GRUB 菜单不显示
- 原因:/etc/default/grub中GRUB_TIMEOUT设为 0,或 GRUB 配置损坏;
- 解决:进入救援模式,修改GRUB_TIMEOUT=5,再执行grub2-mkconfig -o /boot/grub2/grub.cfg。
- 服务启动失败:Active: failed
- 步骤 1:用systemctl status 服务名查看状态摘要;
- 步骤 2:用journalctl -u 服务名 -xe查看详细日志,定位错误(如脚本路径错误、权限不足)。
- 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 进程:
- 启动top,按P排序,找到 CPU 占用 90% 的进程(PID=5678);
- 按k,输入5678,按回车;
- 输入信号编号(如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配置事件,系统管理,进程管理。
更多推荐


所有评论(0)