进程与系统管理

瑞克 0 阅读 linux服务

进程与系统管理


目录

  1. 进程是什么
  2. 查看进程:ps命令
  3. 实时监控:top/htop/atop
  4. 结束进程:kill家族
  5. 前台与后台:jobs/bg/fg
  6. 进程优先级:nice与renice
  7. systemd服务管理
  8. 一次性定时任务:at
  9. 内核模块管理
  10. 系统启动流程
  11. /proc和/sys文件系统
  12. 运维常用命令精选
  13. 趣味命令专栏

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
CCPU使用率
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
字段含义
%CPUCPU使用百分比
%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 -efps aux 的主要区别是什么?在什么场景下你会选择哪一种?

提示:aux多了%CPU和%MEM字段,适合快速排查资源占用;-ef有PPID字段,适合分析进程父子关系。


3. 实时监控:top/htop/atop

问题:ps只能看到"快照",我想实时观察系统资源变化,怎么办?

解决:使用 tophtopatop

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家族

问题:某个程序卡死了,怎么让它停下来?

解决:使用 killkillallpkill

信号(Signal)基础

Linux通过信号与进程通信,就像给进程发"短信":

信号编号含义能否被忽略
SIGTERM15请优雅退出(默认)可以
SIGKILL9立即强制终止不可以
SIGHUP1重新加载配置可以
SIGSTOP19暂停进程不可以
SIGCONT18恢复被暂停的进程不可以

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,怎么让重要任务优先?

解决:使用 nicerenice 调整优先级。

生活类比

🏥 医院类比: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 restartsystemctl 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的区别

特性atcrontab
执行次数一次性周期性
语法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系
查看模块lsmodlsmod
加载模块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.targetbasic.targetmulti-user.targetgraphical.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系统的"体检报告"