进程与服务管理
最后更新: 2026-01-08
作者: Linux Team
页面目录
目录
进程基础
什么是进程?
进程是运行中的程序实例,是Linux系统资源分配的基本单位。每个进程都有一个唯一的PID(进程ID)。
┌─────────────────────────────────────────────────────────────┐
│ 进程与程序 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 程序 ──→ 静态代码文件,存储在磁盘上 │
│ 例: /bin/bash, /usr/bin/nginx │
│ │
│ 进程 ──→ 动态运行的实例,内存中执行 │
│ 例: PID 1234, 分配CPU时间、内存 │
│ │
│ 线程 ──→ 进程内的执行单元,共享进程资源 │
│ │
└─────────────────────────────────────────────────────────────┘
进程类型
| 类型 | 说明 | 特性 |
|---|---|---|
| 前台进程 | 与终端关联,占用终端 | 可交互 |
| 后台进程 | 不占用终端,启动时加 & |
不可交互 |
| 守护进程(Daemon) | 系统服务,脱离终端运行 | 自动启动 |
| 僵尸进程(Zombie) | 进程已终止但未回收 | 占用PID |
| 孤儿进程(Orphan) | 父进程退出,子进程被init收养 | 正常运行 |
进程状态
┌─────────────────────────────────────────────────────────────┐
│ 进程状态转换 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 新建 → 就绪 → 运行 → 阻塞 → 终止 │
│ ↑ ↓ ↓ │
│ └──←────┘ ↓ │
│ → 僵尸 │
│ │
│ 状态码: │
│ R - 运行中(Running/Runnable) │
│ S - 可中断睡眠(Interruptible Sleep) │
│ D - 不可中断睡眠(Uninterruptible Sleep) │
│ Z - 僵尸(Zombie) │
│ T - 停止(Stopped/Traced) │
│ X - 死亡(Dead) │
│ │
└─────────────────────────────────────────────────────────────┘
进程查看命令
ps - 进程快照
# BSD风格
ps aux # 显示所有进程(含其他用户)
ps -ef # 标准格式显示
ps -eLf # 显示线程
ps -eo pid,ppid,user,%cpu,%mem,cmd # 自定义列
# Unix风格
ps -p 1234 # 查看指定PID
ps --ppid 1234 # 查看指定进程的子进程
ps -U username # 查看用户进程
ps -G groupname # 查看组进程
# 常用组合
ps aux | grep nginx # 查找nginx进程
ps -ef | grep "[p]ython" # 排除grep自身
ps --sort=-%cpu | head # 按CPU排序
ps --sort=-%mem | head # 按内存排序
# 树形显示
ps -ef --forest # 显示进程树
pstree # 树形显示(需安装psmisc)
pstree -p # 显示PID
pstree -u username # 显示用户进程树
top/htop - 动态监控
# top - 实时进程监控
top # 启动top
top -d 5 # 每5秒刷新
top -p 1234 # 监控指定PID
top -u username # 只显示用户进程
top -b -n 10 > top.log # 批处理模式输出
# top快捷键
h/? 帮助
q 退出
z 彩色显示
x/y 高亮排序列/字段
P 按CPU排序
M 按内存排序
T 按时间排序
k 终止进程
r 重新设置优先级
u 过滤用户
n 设置显示进程数
l 显示/隐藏负载
t/m 显示/隐藏CPU/内存
1 显示所有CPU核心
W 保存配置
# htop - 更友好的监控(需安装)
sudo apt install htop
htop # 启动
htop -d 10 # 10秒刷新
htop -u username # 过滤用户
htop -p 1234,5678 # 监控指定PID
# htop快捷键
F1-? 帮助
F2 设置
F3 搜索进程
F4 过滤
F5 树形显示
F6 排序
F7/F8 降低/提高优先级
F9 发送信号
F10 退出
# htop配色方案
htop -t # 显示进程树
htop -s MEM # 按内存排序启动
其他进程命令
# pgrep - 按名称搜索进程
pgrep nginx # 返回PID
pgrep -l nginx # 显示名称
pgrep -u root nginx # root用户的nginx进程
pgrep -f "nginx.*8080" # 匹配完整命令行
# pidof - 获取进程PID
pidof nginx # 精确匹配程序名
pidof -s nginx # 只返回一个PID
pidof -x script.sh # 查找脚本进程
# pkill - 按名终止进程
pkill nginx # 终止所有nginx
pkill -u user nginx # 终止用户的nginx
pkill -9 nginx # 强制终止
pkill -f "python.*server" # 匹配命令行
# killall - 按名终止所有进程
killall nginx
killall -i nginx # 交互确认
killall -9 nginx # 强制终止
killall -u user nginx # 终止用户进程
killall --older-than 1h nginx # 终止1小时前的进程
进程控制
发送信号
# 常用信号
kill -l # 列出所有信号
# 信号列表
1) SIGHUP 挂起,重读配置
2) SIGINT 中断(Ctrl+C)
3) SIGQUIT 退出(Ctrl+\)
9) SIGKILL 强制终止
15) SIGTERM 优雅终止(默认)
18) SIGCONT 继续运行
19) SIGSTOP 暂停
20) SIGTSTP 挂起(Ctrl+Z)
# 使用示例
kill 1234 # 发送TERM信号
kill -9 1234 # 强制终止
kill -SIGTERM 1234 # 使用名称
kill -s TERM 1234 # 同上
kill -l 15 # 查看信号15名称
作业控制
# 后台运行
command & # 后台运行
nohup command & # 忽略挂起信号
nohup command > output.log & # 输出重定向
# jobs - 查看作业
jobs # 列出所有作业
jobs -l # 显示PID
jobs -p # 只显示PGID
jobs -r # 只显示运行的
jobs -s # 只显示停止的
# fg/bg - 前后台切换
fg # 恢复最近后台作业
fg %1 # 恢复作业1
fg %nginx # 恢复包含nginx的作业
bg # 让停止的作业在后台继续
bg %2 # 后台运行作业2
# Ctrl+Z - 挂起当前作业
Ctrl+Z # 挂起当前作业
nohup与screen
# nohup - 持久运行
nohup ./script.sh & # 后台运行
nohup ./script.sh > output.log 2>&1 & # 重定向输出
echo "password" | nohup command & # 提供输入
# screen - 虚拟终端
sudo apt install screen
screen -S mysession # 创建命名会话
screen -ls # 列出所有会话
screen -r mysession # 恢复会话
Ctrl+A D # 分离会话
Ctrl+A N # 新窗口
Ctrl+A W # 窗口列表
Ctrl+A K # 关闭窗口
Ctrl+A [ # 复制/滚动模式
# tmux - 更强大的终端管理器(推荐)
sudo apt install tmux
tmux new -s mysession # 创建会话
tmux ls # 列出会话
tmux attach -t mysession # 连接会话
tmux detach # 分离
# tmux快捷键(前缀Ctrl+B)
d 分离
c 新窗口
% 左右分屏
" 上下分屏
o 切换面板
x 关闭面板
z 最大化面板
[ 复制模式
服务管理
systemd 概述
systemd是现代Linux系统的主流服务管理器。
┌─────────────────────────────────────────────────────────────┐
│ systemd 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ systemd ──→ systemctl ──→ 服务单元 │
│ │ │
│ ┌──────┴──────┐ │
│ ↓ ↓ │
│ service socket │
│ timer path │
│ mount swap │
│ │
└─────────────────────────────────────────────────────────────┘
systemctl 基础命令
# 启动和停止
sudo systemctl start nginx # 启动服务
sudo systemctl stop nginx # 停止服务
sudo systemctl restart nginx # 重启服务
sudo systemctl reload nginx # 重载配置
# 查看状态
sudo systemctl status nginx # 显示详细状态
sudo systemctl is-active nginx # 检查是否运行
sudo systemctl is-enabled nginx # 检查是否开机启动
sudo systemctl show nginx # 显示服务属性
# 开机启动
sudo systemctl enable nginx # 开机启动
sudo systemctl disable nginx # 禁用开机启动
sudo systemctl mask nginx # 屏蔽服务(禁止启动)
sudo systemctl unmask nginx # 取消屏蔽
# 查看服务列表
systemctl list-units --type=service --all # 所有服务
systemctl list-units --type=service --state=running # 运行中的
systemctl list-dependencies nginx # 依赖关系
systemctl list-unit-files # 单元文件
# 查看日志
sudo journalctl -u nginx # 服务日志
sudo journalctl -u nginx --since today # 今日日志
sudo journalctl -u nginx -f # 实时日志
sudo journalctl -xe # 系统日志
服务单元文件
# 位置
/etc/systemd/system/ # 系统服务
/usr/lib/systemd/system/ # 软件包服务
~/.config/systemd/user/ # 用户服务
# 示例:nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
init.d 脚本(旧式)
# SysVinit 服务
/etc/init.d/nginx start
/etc/init.d/nginx stop
/etc/init.d/nginx restart
/etc/init.d/nginx status
# update-rc.d(Debian/Ubuntu)
sudo update-rc.d nginx defaults
sudo update-rc.d nginx enable
sudo update-rc.d nginx disable
sudo update-rc.d -f nginx remove
# chkconfig(CentOS/RHEL)
sudo chkconfig nginx on
sudo chkconfig nginx off
sudo chkconfig --list nginx
服务依赖管理
# 查看依赖
systemctl list-dependencies nginx
# 反向依赖
systemctl list-dependencies --reverse nginx
# 重新加载systemd
sudo systemctl daemon-reload
# 重新加载配置
sudo systemctl reload daemon-reload
资源监控
CPU监控
# top
top
# 按P排序查看CPU使用
# mpstat(需安装sysstat)
sudo apt install sysstat
mpstat # 每CPU统计
mpstat -P ALL 1 5 # 每1秒,共5次
# iostat
iostat -c # 只显示CPU
# lscpu
lscpu # CPU详细信息
内存监控
# free
free # 基本信息
free -h # 人类可读
free -m # 以MB为单位
free -s 5 # 每5秒刷新
watch -n 1 free -h # 实时监控
# 输出解释
# total 总内存
# used 已使用(含缓存)
# free 完全空闲
# available 实际可用(含缓存回收)
磁盘I/O监控
# iostat
iostat # 基本统计
iostat -x # 详细统计
iostat -d 1 5 # 每秒,共5次
iostat -p sda # 单个设备
# iotop
sudo apt install iotop
sudo iotop # 实时I/O
sudo iotop -o # 只显示活动进程
sudo iotop -b -n 5 # 批处理模式
# ioping
sudo ioping /dev/sda1 # 测试磁盘延迟
网络监控
# iftop
sudo apt install iftop
sudo iftop -i eth0 # 监控接口
# nethogs
sudo apt install nethogs
sudo nethogs eth0 # 按进程网络使用
# ss - Socket统计
ss -tulnp # 所有监听端口
ss -tn # TCP连接
ss -un # UDP连接
ss -p # 显示进程
ss state established # 已建立连接
综合监控工具
# glances(推荐)
sudo apt install glances
glances # 启动
glances -t 2 # 2秒刷新
glances -c @remote_ip # 远程监控
# nmon
sudo apt install nmon
nmon # 交互式监控
# dstat
sudo apt install dstat
dstat # 综合统计
dstat -cdngy # CPU、磁盘、网络、内存、负载
进程优先级
nice值
# nice值范围:-20(高优先级)到 19(低优先级)
# 默认nice值:0
# 启动时设置优先级
nice -n 10 command # 低优先级启动
nice -n -10 command # 高优先级启动(需root)
nice -n 19 ./backup.sh # 后台备份设为低优先级
# 查看进程nice值
ps -eo pid,ni,cmd
renice - 调整优先级
# 调整运行中的进程
sudo renice -n 10 -p 1234 # 设置PID 1234为nice=10
sudo renice -n 10 -u username # 调整用户所有进程
sudo renice -n 10 -g groupname # 调整组进程
# top中调整
# 启动top后按r,输入PID和新的PR值
real-time priority
# 查看调度策略
ps -eo pid,policy,cmd
# SCHEDULER类型
# NORMAL/SCHED_OTHER: 普通调度
# FIFO: 实时FIFO
# RR: 实时轮询
# 设置实时优先级
sudo chrt -f 50 -p 1234 # FIFO,优先级50
sudo chrt -r 50 -p 1234 # RR,优先级50
课后练习
实践任务
- 使用
ps、top、htop查看系统进程 - 启动nginx服务,练习
systemctl start/stop/status - 创建后台任务,使用
jobs和fg/bg进行控制 - 使用
screen创建持久会话,运行长时间任务 - 分析日志找出占用CPU/内存最高的进程
- 编写脚本监控服务状态,服务停止时自动重启
下一篇预告:我们将学习软件包管理,掌握apt、yum/dnf的使用方法。