进程与系统管理
进程与系统管理
目录
- 进程是什么
- 查看进程:ps命令
- 实时监控:top/htop/atop
- 结束进程:kill家族
- 前台与后台:jobs/bg/fg
- 进程优先级:nice与renice
- systemd服务管理
- 一次性定时任务:at
- 内核模块管理
- 系统启动流程
- /proc和/sys文件系统
- 运维常用命令精选
- 趣味命令专栏
1. 进程是什么
生活类比
🏫 学校类比:程序是"教案"(静态文件),进程是"正在上课"(动态执行)。同一份教案可以同时在多个班级上课——同一个程序也可以有多个进程。
进程(Process) 是正在运行的程序的实例。每个进程都有一个唯一的 PID(进程ID),就像每个学生的学号一样。
进程的状态
| 状态 | 符号 | 说明 |
|---|---|---|
| 运行中 | R | 正在执行或在运行队列中等待 |
| 睡眠 | S | 等待某个事件(如用户输入) |
| 不可中断睡眠 | D | 等待I/O操作,不能被信号中断 |
| 停止 | T | 被停止(如按了Ctrl+Z) |
| 僵尸 | Z | 进程已结束但父进程未回收 |
💡 想一想:僵尸进程占不占用CPU?为什么系统要保留僵尸进程?
提示:僵尸进程不占CPU和内存,但占用进程表条目,等待父进程读取退出状态。
2. 查看进程:ps命令
问题:我想知道系统里现在跑了哪些程序,怎么办?
解决:使用 ps 命令。
# 最常用的两种格式
ps -ef # System V 风格,字段清晰
ps aux # BSD 风格,信息丰富
ps -ef 输出解读
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 08:00 ? 00:00:03 /usr/lib/systemd/systemd
root 512 1 0 08:01 ? 00:00:00 /usr/sbin/sshd
teacher 1024 512 0 09:00 pts/0 00:00:00 bash
teacher 1200 1024 0 09:30 pts/0 00:00:05 python3 calc.py
| 字段 | 含义 |
|---|---|
| UID | 进程所属用户 |
| PID | 进程ID |
| PPID | 父进程ID |
| C | CPU使用率 |
| STIME | 启动时间 |
| TTY | 关联终端 |
| TIME | 累计CPU时间 |
| CMD | 命令名 |
ps aux 输出解读
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 169344 11992 ? Ss 08:00 0:03 /usr/lib/systemd/systemd
teacher 1200 2.1 0.5 225680 42100 pts/0 S+ 09:30 0:05 python3 calc.py
| 字段 | 含义 |
|---|---|
| %CPU | CPU使用百分比 |
| %MEM | 内存使用百分比 |
| VSZ | 虚拟内存(KB) |
| RSS | 实际占用内存(KB) |
| STAT | 进程状态 |
实用技巧
# 查找特定进程
ps -ef | grep nginx
ps aux | grep python
# 按CPU使用率排序(取前10)
ps aux --sort=-%cpu | head -11
# 按内存使用率排序(取前10)
ps aux --sort=-%mem | head -11
# 以树形结构显示进程关系
ps -ef --forest
pstree -p
💡 想一想:
ps -ef和ps aux的主要区别是什么?在什么场景下你会选择哪一种?提示:aux多了%CPU和%MEM字段,适合快速排查资源占用;-ef有PPID字段,适合分析进程父子关系。
3. 实时监控:top/htop/atop
问题:ps只能看到"快照",我想实时观察系统资源变化,怎么办?
解决:使用 top、htop 或 atop。
top —— 系统自带的"心电图"
top
top输出上半部分(系统概览):
top - 14:30:22 up 5 days, 3:12, 2 users, load average: 0.15, 0.10, 0.05
Tasks: 150 total, 1 running, 149 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.3 us, 0.7 sy, 0.0 ni, 96.8 id, 0.2 wa, 0.0 hi, 0.0 si
MiB Mem : 7982.5 total, 2156.3 free, 3421.8 used, 2404.4 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 4089.2 avail Mem
load average解读:三个数字分别是1分钟、5分钟、15分钟的平均负载。
- 对于4核CPU:负载 < 4 表示系统轻松;负载 > 4 表示有任务在排队等待
- 类比:就像超市收银台——4个收银台同时工作,超过4个人排队就会有人等待
常用快捷键:
| 按键 | 功能 |
|---|---|
P | 按CPU使用率排序 |
M | 按内存使用率排序 |
k | 杀掉一个进程 |
r | 修改进程优先级 |
1 | 显示每个CPU核心 |
q | 退出 |
htop —— 更好看的top
# 安装 htop
# RHEL系 (CentOS/RHEL/Fedora/麒麟V10)
sudo yum install -y htop # CentOS 7
sudo dnf install -y htop # Fedora / CentOS 8+ / 麒麟V10
# Debian系 (Ubuntu/Debian/Kali)
sudo apt install -y htop
htop的优势:
- 彩色界面,一目了然
- 支持鼠标点击
- 可以用方向键选择进程
- 底部显示F1-F10功能键提示
atop —— 系统级"黑匣子"
# 安装
sudo yum install -y atop # RHEL系
sudo apt install -y atop # Debian系
# 使用(每5秒采样一次)
atop 5
atop会记录历史数据,可以"回放"过去的系统状态,非常适合事后排查问题。
💡 想一想:如果一台服务器在凌晨3点突然变慢,但你当时不在电脑前,用哪个工具可以事后分析?
答案:atop,它会自动记录历史数据,可以用
atop -r回放。
4. 结束进程:kill家族
问题:某个程序卡死了,怎么让它停下来?
解决:使用 kill、killall 或 pkill。
信号(Signal)基础
Linux通过信号与进程通信,就像给进程发"短信":
| 信号 | 编号 | 含义 | 能否被忽略 |
|---|---|---|---|
| SIGTERM | 15 | 请优雅退出(默认) | 可以 |
| SIGKILL | 9 | 立即强制终止 | 不可以 |
| SIGHUP | 1 | 重新加载配置 | 可以 |
| SIGSTOP | 19 | 暂停进程 | 不可以 |
| SIGCONT | 18 | 恢复被暂停的进程 | 不可以 |
kill —— 按PID发送信号
# 优雅终止(发送SIGTERM,默认信号15)
kill 1234
# 强制终止(发送SIGKILL,信号9)
kill -9 1234
# 重新加载配置(发送SIGHUP,信号1)
kill -HUP 1234
# 示例:重启nginx配置
kill -HUP $(cat /var/run/nginx.pid)
killall —— 按名称批量终止
# 终止所有名为nginx的进程
killall nginx
# 强制终止
killall -9 python3
pkill —— 按模式匹配终止
# 终止某个用户的所有进程
pkill -u student01
# 终止包含特定关键词的进程
pkill -f "python3.*homework"
⚠️ 危险提醒:永远不要执行
kill -9 -1(杀掉所有进程),这会导致系统崩溃!就像学校里不能拉响所有教室的火警警报——只针对有问题的教室即可。
💡 想一想:为什么优先用
kill(SIGTERM)而不是kill -9(SIGKILL)?答案:SIGTERM让进程有机会保存数据、清理临时文件、释放资源,而SIGKILL直接终止,可能导致数据丢失。
5. 前台与后台:jobs/bg/fg
问题:运行一个长时间任务时,终端被占用了怎么办?
解决:使用前台/后台作业管理。
生活类比
🍳 厨房类比:前台进程就像你正在炒的菜(占用你的注意力),后台进程就像炖着的汤(不需要一直盯着)。
# 前台运行(终端被占用)
python3 calculate.py
# 后台运行(在命令末尾加 &)
python3 calculate.py &
# 查看当前shell的所有作业
jobs
# 输出示例:
# [1]- Running python3 calculate.py &
# [2]+ Stopped vim notes.txt
实用操作
# Ctrl+Z:暂停当前前台任务(放入"暂停区")
# bg:让暂停的任务在后台继续运行
# fg:把后台任务调回前台
# 完整流程演示:
$ python3 long_calc.py # 前台运行
# 按 Ctrl+Z 暂停
[1]+ Stopped python3 long_calc.py
$ bg %1 # 让作业1在后台继续
[1]+ python3 long_calc.py &
$ jobs # 查看作业列表
[1]+ Running python3 long_calc.py &
$ fg %1 # 把作业1调回前台
python3 long_calc.py
nohup —— 退出终端也不影响
# 即使关闭终端,任务仍然运行
nohup python3 calculate.py > output.log 2>&1 &
# 查看输出
tail -f output.log
💡 想一想:
nohup和&有什么区别?只用&够不够?答案:
&只是放到后台,关闭终端时后台任务也会被终止(收到SIGHUP)。nohup让进程忽略SIGHUP信号,确保关闭终端后任务继续运行。
6. 进程优先级:nice与renice
问题:某些任务太"霸道"占满了CPU,怎么让重要任务优先?
解决:使用 nice 和 renice 调整优先级。
生活类比
🏥 医院类比:nice值就像挂号的优先级——急诊(高优先级)优先看,普通门诊(低优先级)要等。nice值越小,优先级越高。
| nice值 | 优先级 | 说明 |
|---|---|---|
| -20 | 最高 | 最先获得CPU |
| 0 | 默认 | 普通优先级 |
| 19 | 最低 | 最后获得CPU |
# 以指定nice值启动进程
nice -n 10 python3 backup.py # 低优先级运行备份
# 修改已运行进程的优先级
renice -n 5 -p 1234 # 把PID 1234的nice值改为5
# 修改进程组
renice -n 10 -g 500
# 修改某用户所有进程
renice -n 10 -u student01
⚠️ 只有 root用户 可以设置负的nice值(提高优先级),普通用户只能增加nice值(降低优先级)。
💡 想一想:为什么普通用户不能把nice值设为负数?
答案:如果允许,用户可以把自己进程的优先级调到最高,抢占系统资源,影响其他用户。
7. systemd服务管理
问题:如何管理系统中各种后台服务(如SSH、Nginx、数据库)?
解决:使用 systemctl 命令——systemd的"遥控器"。
生活类比
📱 手机类比:systemd就像手机的"设置→应用管理"——可以启动/停止应用、设置开机自启、查看应用日志。
systemctl 常用操作
# 启动服务
sudo systemctl start sshd
# 停止服务
sudo systemctl stop sshd
# 重启服务
sudo systemctl restart sshd
# 重新加载配置(不中断服务)
sudo systemctl reload sshd
# 查看服务状态
systemctl status sshd
# 设置开机自启
sudo systemctl enable sshd
# 取消开机自启
sudo systemctl disable sshd
# 查看服务是否开机自启
systemctl is-enabled sshd
各发行版通用命令对比
| 操作 | RHEL系 / Debian系 | 说明 |
|---|---|---|
| 启动 | systemctl start <服务> | 通用 |
| 查看状态 | systemctl status <服务> | 通用 |
| 开机自启 | systemctl enable <服务> | 通用 |
| 列出所有服务 | systemctl list-units --type=service | 通用 |
| 列出失败服务 | systemctl --failed | 通用 |
💡 好消息:systemd在所有主流发行版中都是统一的——CentOS 7+、RHEL 7+、Fedora、麒麟V10、Ubuntu 16.04+、Debian 8+ 都使用systemd。命令完全一致!
journalctl —— 系统日志查看器
# 查看某个服务的日志
sudo journalctl -u sshd
# 实时跟踪日志(类似 tail -f)
sudo journalctl -u sshd -f
# 查看今天的日志
sudo journalctl --since today
# 查看最近1小时的日志
sudo journalctl --since "1 hour ago"
# 查看某次启动以来的日志
sudo journalctl -b
# 按优先级过滤(只看错误)
sudo journalctl -p err
# 查看磁盘占用
sudo journalctl --disk-usage
# 清理旧日志(只保留最近7天)
sudo journalctl --vacuum-time=7d
💡 想一想:
systemctl restart和systemctl reload有什么区别?生产环境中优先用哪个?答案:restart会完全重启服务(中断现有连接),reload只重新加载配置文件(不中断服务)。生产环境优先用reload。
8. 一次性定时任务:at
问题:我想让系统在某个时间自动执行一个任务,但不想反复执行,怎么办?
解决:使用 at 命令设置一次性定时任务。
# 5分钟后执行
echo "wall '同学们,该下课了!'" | at now + 5 minutes
# 今天下午3点执行
echo "echo '会议提醒' > /tmp/reminder.txt" | at 15:00
# 明天上午9点执行
echo "systemctl restart nginx" | at 9:00 AM tomorrow
# 查看待执行的at任务
atq
# 删除某个at任务
atrm <任务编号>
与crontab的区别
| 特性 | at | crontab |
|---|---|---|
| 执行次数 | 一次性 | 周期性 |
| 语法 | at <时间> | cron表达式 |
| 适用场景 | "明天凌晨3点重启服务器" | "每天凌晨3点备份" |
💡 想一想:如果你想每天凌晨2点自动清理日志,应该用
at还是crontab?答案:crontab,因为这是周期性任务。at只适合一次性任务。
9. 内核模块管理
问题:需要给系统添加新的硬件驱动(如网卡驱动),但不想重启,怎么办?
解决:使用内核模块管理命令,动态加载/卸载驱动。
生活类比
🧩 积木类比:内核模块就像乐高积木——需要时拼上去(加载),不需要时拆下来(卸载),不用拆整个模型(不用重启)。
# 查看已加载的模块
lsmod
# 输出示例:
# Module Size Used by
# e1000 135168 0
# usbhid 53248 0
# 查看模块详细信息
modinfo e1000
# 加载模块
sudo modprobe e1000
# 卸载模块
sudo rmmod e1000
# 加载模块并传参
sudo modprobe e1000 speed=1000
各发行版差异
| 操作 | RHEL系 | Debian系 |
|---|---|---|
| 查看模块 | lsmod | lsmod |
| 加载模块 | modprobe <模块> | modprobe <模块> |
| 卸载模块 | rmmod <模块> | rmmod <模块> |
| 模块配置文件 | /etc/modprobe.d/*.conf | /etc/modprobe.d/*.conf |
| 持久化设置 | echo "模块名" > /etc/modules-load.d/xxx.conf | 同左 |
💡 好消息:内核模块命令在所有发行版中完全一致!
10. 系统启动流程
问题:按下电源键后,Linux系统经历了哪些步骤才到达登录界面?
解决:理解启动流程,才能在系统出问题时精准定位。
启动流程五步走
┌──────┐ ┌──────┐ ┌────────┐ ┌─────────┐ ┌──────────┐
│ BIOS │──>│ GRUB │──>│ Kernel │──>│ systemd │──>│ 登录界面 │
│/UEFI │ │引导器 │ │ 内核 │ │ PID 1 │ │ │
└──────┘ └──────┘ └────────┘ └─────────┘ └──────────┘
第一步:BIOS/UEFI(硬件自检)
- 加电自检(POST):检查内存、硬盘、键盘等硬件
- 查找可启动设备
- 类比:就像学校开门前的保安检查——确认所有设施正常后,才让师生进入
第二步:GRUB(引导加载器)
- 显示启动菜单(可选择不同内核或系统)
- 加载内核到内存
- 配置文件:
/boot/grub2/grub.cfg(RHEL系)或/boot/grub/grub.cfg(Debian系)
# 查看GRUB配置
# RHEL系
cat /boot/grub2/grub.cfg
# Debian系
cat /boot/grub/grub.cfg
# 修改GRUB默认启动项
# RHEL系:编辑 /etc/default/grub,然后
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# Debian系:编辑 /etc/default/grub,然后
sudo update-grub
第三步:Kernel(内核加载)
- 解压内核到内存
- 初始化硬件驱动
- 挂载根文件系统(/)为只读
- 启动第一个用户进程:systemd(PID 1)
第四步:systemd(系统初始化)
- 按照"target"(目标)依次启动服务
- 启动顺序:
sysinit.target→basic.target→multi-user.target→graphical.target - 类比:就像学校的开学流程——先检查设施(sysinit),再开基础服务(basic),然后启动教学服务(multi-user),最后开放图形界面(graphical)
# 查看默认启动目标
systemctl get-default
# 修改默认启动目标
sudo systemctl set-default multi-user.target # 命令行模式
sudo systemctl set-default graphical.target # 图形界面模式
第五步:登录界面
- 启动
getty进程(终端登录)或显示管理器(图形登录) - 用户输入用户名和密码
各发行版GRUB差异对比
| 项目 | RHEL系 | Debian系 |
|---|---|---|
| GRUB配置文件 | /boot/grub2/grub.cfg | /boot/grub/grub.cfg |
| GRUB默认设置 | /etc/default/grub | /etc/default/grub |
| 更新GRUB命令 | grub2-mkconfig -o ... | update-grub |
| 内核位置 | /boot/vmlinuz-xxx | /boot/vmlinuz-xxx |
💡 想一想:如果系统启动后直接进入命令行而非图形界面,可能是哪个target设置错了?怎么修改?
答案:默认target设为了
multi-user.target,用systemctl set-default graphical.target改回图形界面。
11. /proc和/sys文件系统
问题:不看任何命令的输出,能不能直接"读取"系统状态?
解决:/proc 和 /sys 是Linux提供的两个"信息窗口"——它们不是真正的文件,而是内核状态的实时映射。
/proc —— 进程与系统信息的"档案室"
# 查看CPU信息
cat /proc/cpuinfo
# 查看内存信息
cat /proc/meminfo
# 查看系统负载
cat /proc/loadavg
# 查看内核版本
cat /proc/version
# 查看某个进程的详细信息(以PID 1为例)
ls /proc/1/
cat /proc/1/status # 进程状态
cat /proc/1/cmdline # 启动命令
cat /proc/1/environ # 环境变量
实用技巧:
# 快速查看总内存(单位:MB)
awk '/MemTotal/{printf "%.0f MB\n", $2/1024}' /proc/meminfo
# 查看CPU核心数
grep -c processor /proc/cpuinfo
# 查看系统运行时间(秒)
cat /proc/uptime
/sys —— 硬件与内核参数的"控制面板"
# 查看CPU调度策略
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 查看网络设备信息
ls /sys/class/net/
# 修改内核参数(临时)
echo 1 > /proc/sys/net/ipv4/ip_forward # 开启路由转发
# 永久修改内核参数
# 编辑 /etc/sysctl.conf,然后:
sudo sysctl -p
💡 想一想:
/proc里的文件可以修改吗?修改后会怎样?答案:部分文件可以写入(如
/proc/sys/下的内核参数),修改后立即生效,但重启后失效。要永久生效需写入/etc/sysctl.conf。
12. 运维常用命令精选
以下命令是日常运维的"瑞士军刀",建议收藏。
进程排查三板斧
# 第一板斧:谁在用CPU?
ps aux --sort=-%cpu | head -11
# 第二板斧:谁在用内存?
ps aux --sort=-%mem | head -11
# 第三板斧:整体情况如何?
top -bn1 | head -20
服务管理速查
# 查看所有失败的服务
systemctl --failed
# 批量重启失败服务(慎用)
systemctl --failed --no-legend | awk '{print $1}' | xargs -I {} systemctl restart {}
# 查看某个服务的配置文件路径
systemctl show -p FragmentPath sshd
# 查看服务启动耗时
systemd-analyze
systemd-analyze blame # 各服务启动耗时排名
systemd-analyze critical-chain # 关键启动链
系统信息快速收集
# 一键收集系统基本信息
echo "=== 系统 ===" && uname -a
echo "=== CPU ===" && lscpu | head -10
echo "=== 内存 ===" && free -h
echo "=== 磁盘 ===" && df -h
echo "=== 负载 ===" && uptime
echo "=== 进程TOP5(CPU) ===" && ps aux --sort=-%cpu | head -6
僵尸进程清理
# 查找僵尸进程
ps aux | awk '$8=="Z"'
# 找到僵尸进程的父进程并重启它
ps -o ppid= -p <僵尸PID>
kill -HUP <父进程PID>
13. 趣味命令专栏
运维不只是严肃的工作,Linux还藏着许多有趣的彩蛋!
🐄 cowsay —— 让一头牛替你说话
# 安装
sudo yum install -y cowsay # RHEL系(需EPEL源)
sudo apt install -y cowsay # Debian系
# 使用
cowsay "同学们,今天学的是进程管理!"
# 输出:
# _________________________________
# < 同学们,今天学的是进程管理! >
# ---------------------------------
# \ ^__^
# \ (oo)\_______
# (__)\ )\/\
# ||----w |
# || ||
# 换一种动物
cowsay -f tux "我是企鹅,Linux的吉祥物!"
🚂 sl —— 蒸汽火车(惩罚打错命令)
# 安装
sudo yum install -y sl # RHEL系
sudo apt install -y sl # Debian系
# 运行(一辆火车从终端开过)
sl
# 当你想打 ls 却打成了 sl 时……火车就开过来了!
📊 uptime —— 看看服务器已经连续运行了多久
uptime
# 输出:14:30:22 up 128 days, 3:12, 2 users, load average: 0.15, 0.10, 0.05
# 哇,这台服务器已经连续运行了128天!就像学校连续上课了128天没有放假。
🏎️ yes —— 无限重复输出(演示进程终止的好素材)
# 无限输出 "yes"
yes
# 按 Ctrl+C 终止——这就是 SIGINT 信号!
# 用这个命令来练习 kill 操作也很合适
yes & # 放到后台
kill %1 # 终止作业1
🎯 watch —— 重复执行命令并实时显示
# 每2秒刷新一次内存使用情况
watch -n 2 free -h
# 每1秒高亮显示变化的数值
watch -d -n 1 'ps aux | head -5'
# 监控磁盘写入速度
watch -n 1 'cat /proc/diskstats | grep sda'
🔢 factor —— 质因数分解(数学老师的最爱!)
factor 123456789
# 输出:123456789: 3 3 3607 3803
factor 100
# 输出:100: 2 2 5 5
# 用这个来验证质数
factor 997
# 输出:997: 997 (只有一个因子,说明它是质数!)
📜 fortune —— 随机名言(可以配合cowsay使用)
# 安装
sudo apt install -y fortune # Debian系
sudo yum install -y fortune-mod # RHEL系
# 获取一条随机名言
fortune
# 让牛说名言
fortune | cowsay
本章小结
主题 核心命令 一句话记忆 查看进程 ps -ef/ps aux"拍照"查看当前进程 实时监控 top/htop/atop系统的"心电图" 终止进程 kill/killall/pkill给进程"发通知" 前后台 jobs/bg/fg在"灶台"间切换 优先级 nice/renice给任务"排号" 服务管理 systemctlsystemd的"遥控器" 日志 journalctl系统的"日记本" 启动流程 BIOS→GRUB→Kernel→systemd 开机的"四部曲" 内核模块 lsmod/modprobe给内核"装积木" 内核参数 /proc//sys系统的"体检报告"