Appearance
进程管理
本章将介绍 Linux 进程管理,包括进程查看、进程控制、后台任务管理、进程优先级等内容,帮助你有效管理系统资源。
进程概述
什么是进程?
进程是程序在执行过程中的实例,包含程序代码、数据、系统资源和执行状态。
mermaid
graph TD
A[程序] --> B[进程]
B --> C[代码段]
B --> D[数据段]
B --> E[堆栈]
B --> F[进程控制块 PCB]
F --> F1[PID]
F --> F2[状态]
F --> F3[优先级]
F --> F4[资源]进程状态
| 状态 | 说明 | 标识 |
|---|---|---|
| 运行 | 正在执行或等待 CPU | R |
| 睡眠 | 等待资源或事件 | S |
| 磁盘睡眠 | 不可中断的睡眠 | D |
| 停止 | 被暂停 | T |
| 僵尸 | 已终止但未被回收 | Z |
进程属性
bash
# 进程的主要属性:
# PID - 进程 ID(唯一标识)
# PPID - 父进程 ID
# UID - 用户 ID
# GID - 组 ID
# 状态 - 进程当前状态
# 优先级 - 调度优先级
# 内存 - 占用的内存
# CPU - CPU 使用率
# 查看当前 Shell 的 PID
echo $$
# 输出:12345
# 查看最近后台进程的 PID
echo $!ps - 查看进程
基本用法
bash
# ps (process status) - 查看进程状态
# 查看当前终端的进程
ps
# 查看所有进程
ps -e
ps -A
# 详细格式
ps -ef
# BSD 格式
ps aux
# 查看指定用户的进程
ps -u username
# 查看指定 PID
ps -p 1234
# 查看进程树
ps -ejH
ps --forest
# 显示线程
ps -eLf
ps -T -p 1234ps 输出解释
bash
# ps aux 输出示例
ps aux
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
# root 1 0.0 0.1 169424 11200 ? Ss Jan15 0:01 /sbin/init
# user 1234 0.5 2.1 123456 78900 ? Ssl 10:30 0:02 nginx
# 字段说明:
# USER - 用户名
# PID - 进程 ID
# %CPU - CPU 使用率
# %MEM - 内存使用率
# VSZ - 虚拟内存大小(KB)
# RSS - 物理内存大小(KB)
# TTY - 终端
# STAT - 进程状态
# START - 启动时间
# TIME - CPU 时间
# COMMAND - 命令
# STAT 状态字符:
# R - 运行中
# S - 睡眠中
# D - 不可中断睡眠
# T - 停止
# Z - 僵尸进程
# < - 高优先级
# N - 低优先级
# L - 有锁定的内存页
# s - 会话领导者
# l - 多线程
# + - 前台进程组自定义输出格式
bash
# 指定显示的列
ps -eo pid,ppid,user,%cpu,%mem,cmd
# 常用列:
# pid, ppid, user, uid, gid, group
# %cpu, %mem, vsz, rss
# stat, state, tty
# start, lstart, etime
# time, cputime
# cmd, command, args
# pri, priority, nice
# 按内存排序
ps aux --sort=-%mem | head -10
# 按 CPU 排序
ps aux --sort=-%cpu | head -10
# 查看占用内存最多的 10 个进程
ps aux --sort=-%mem | head -11
# 查看占用 CPU 最多的 10 个进程
ps aux --sort=-%cpu | head -11top - 动态监控
基本使用
bash
# top - 动态显示进程状态
# 启动 top
top
# 指定刷新间隔(秒)
top -d 5
# 监控指定用户
top -u username
# 监控指定 PID
top -p 1234,5678
# 显示完整命令行
top -c
# 批处理模式(输出到文件)
top -b -n 1 > top_output.txttop 交互命令
bash
# 在 top 运行时使用的快捷键:
# 帮助
h 或 ?
# 退出
q
# 刷新
空格键
# 排序
M - 按内存排序
P - 按 CPU 排序(默认)
T - 按时间排序
N - 按 PID 排序
# 显示模式
1 - 显示所有 CPU 核心
c - 显示完整命令行
S - 累计模式
s - 更改刷新间隔
# 进程操作
k - 终止进程(输入 PID)
r - 调整优先级(renice)
# 显示控制
u - 按用户过滤
o - 添加过滤条件
x - 高亮排序列
z - 彩色显示
b - 粗体显示
# 视图切换
t - CPU 状态显示方式
m - 内存状态显示方式top 输出解释
bash
# top 输出示例:
# top - 10:30:45 up 5 days, 3:21, 2 users, load average: 0.00, 0.01, 0.05
# Tasks: 150 total, 1 running, 149 sleeping, 0 stopped, 0 zombie
# %Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
# MiB Mem : 7823.5 total, 256.3 free, 2048.2 used, 5519.0 buff/cache
# MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 5519.0 avail Mem
# 第一行:
# 当前时间、运行时间、用户数、系统负载(1/5/15分钟)
# 第二行:
# 进程总数、运行数、睡眠数、停止数、僵尸数
# 第三行(CPU):
# us - 用户空间 CPU 占用
# sy - 内核空间 CPU 占用
# ni - nice 进程 CPU 占用
# id - 空闲 CPU
# wa - I/O 等待
# hi - 硬件中断
# si - 软件中断
# st - 虚拟化占用
# 第四行(内存):
# total - 总内存
# free - 空闲内存
# used - 已用内存
# buff/cache - 缓冲/缓存
# 第五行(交换分区):
# total - 总交换空间
# free - 空闲交换空间
# used - 已用交换空间htop - 增强版进程监控
bash
# htop - 交互式进程查看器(需要安装)
# 安装
sudo apt install htop # Debian/Ubuntu
sudo dnf install htop # RHEL/CentOS
# 启动
htop
# 常用快捷键:
# F1 - 帮助
# F2 - 设置
# F3 - 搜索进程
# F4 - 过滤进程
# F5 - 树形视图
# F6 - 排序
# F7 - 降低优先级
# F8 - 提高优先级
# F9 - 终止进程
# F10 - 退出
# 鼠标操作:
# 点击列标题排序
# 点击进程选择
# 点击功能键执行操作进程控制
kill - 发送信号
bash
# kill - 向进程发送信号
# 查看所有信号
kill -l
# 常用信号:
# 1 SIGHUP - 挂起(重新加载配置)
# 2 SIGINT - 中断(Ctrl+C)
# 3 SIGQUIT - 退出
# 9 SIGKILL - 强制终止
# 15 SIGTERM - 正常终止(默认)
# 18 SIGCONT - 继续
# 19 SIGSTOP - 暂停
# 正常终止进程
kill 1234
# 强制终止进程
kill -9 1234
# 重新加载配置
kill -HUP 1234
# 暂停进程
kill -STOP 1234
# 继续进程
kill -CONT 1234
# 终止所有匹配名称的进程
killall nginx
# 使用 pkill
pkill nginx
pkill -u user nginx
pkill -f "python script.py"killall - 按名称终止
bash
# killall - 按进程名终止进程
# 终止所有指定名称的进程
killall nginx
# 使用信号
killall -9 nginx
# 交互模式
killall -i nginx
# 终止指定用户的进程
killall -u user nginx
# 等待进程终止
killall -w nginxpkill - 按模式终止
bash
# pkill - 按模式匹配终止进程
# 按进程名匹配
pkill nginx
# 按完整命令行匹配
pkill -f "python script.py"
# 按用户匹配
pkill -u username
# 按终端匹配
pkill -t pts/0
# 按进程组匹配
pkill -g 1234
# 显示将被终止的进程
pkill -l nginx
# 只显示 PID
pgrep nginx
# 组合使用
pgrep -u username nginxnice 和 renice - 优先级管理
bash
# nice - 以指定优先级启动进程
# 优先级范围:-20(最高)到 19(最低)
# 默认优先级:0
# 以低优先级启动
nice -n 10 tar -czf backup.tar.gz /home
# 以高优先级启动(需要 root)
sudo nice -n -10 ./important_script.sh
# renice - 修改运行中进程的优先级
# 修改进程优先级
renice 5 -p 1234
# 修改用户所有进程的优先级
renice 5 -u username
# 修改进程组优先级
renice 5 -g 1234
# 查看进程优先级
ps -o pid,ni,comm -p 1234
# top 中修改优先级
# 按 r,输入 PID,输入新的 nice 值后台任务管理
后台运行
bash
# 在后台运行命令
command &
# 示例
sleep 100 &
# 输出:[1] 12345
# nohup - 退出终端后继续运行
nohup command &
# 输出重定向
nohup command > output.log 2>&1 &
# setsid - 在新会话中运行
setsid command
# disown - 使作业不受终端关闭影响
command &
disown -h %1
# 示例:后台运行脚本
nohup ./backup.sh > backup.log 2>&1 &
echo $! > backup.pidjobs - 查看后台任务
bash
# jobs - 查看当前 Shell 的后台任务
jobs
# 输出:[1]+ Running sleep 100 &
# 显示 PID
jobs -l
# 输出:[1]+ 12345 Running sleep 100 &
# 只显示 PID
jobs -p
# 显示运行中的任务
jobs -r
# 显示已停止的任务
jobs -sfg 和 bg - 前后台切换
bash
# fg - 将后台任务切换到前台
# 切换最近的后台任务
fg
# 切换指定任务
fg %1
# bg - 将停止的任务放到后台
# 继续最近停止的任务
bg
# 继续指定任务
bg %1
# 示例操作流程
sleep 100 # 前台运行
Ctrl+Z # 暂停任务
bg # 放到后台继续
jobs # 查看任务
fg # 切换回前台
Ctrl+C # 终止任务进程监控工具
pgrep - 查找进程
bash
# pgrep - 查找进程 PID
# 按名称查找
pgrep nginx
# 输出:1234 5678
# 显示进程名
pgrep -l nginx
# 显示完整命令行
pgrep -a nginx
# 按用户查找
pgrep -u root nginx
# 按终端查找
pgrep -t pts/0
# 按模式匹配
pgrep -f "python.*script"
# 统计匹配数量
pgrep -c nginx
# 获取最近启动的进程
pgrep -n nginx
# 获取最早启动的进程
pgrep -o nginxpstree - 进程树
bash
# pstree - 以树形显示进程
# 显示进程树
pstree
# 显示 PID
pstree -p
# 显示完整命令行
pstree -a
# 显示用户
pstree -u
# 显示指定进程的子进程
pstree -p 1234
# 高亮当前进程
pstree -h
# 压缩相同的分支
pstree -cpidstat - 进程统计
bash
# pidstat - 进程资源统计(需要安装 sysstat)
# 安装
sudo apt install sysstat
# 显示所有进程的 CPU 统计
pidstat
# 每 2 秒刷新一次
pidstat 2
# 显示内存统计
pidstat -r
# 显示 I/O 统计
pidstat -d
# 显示特定进程
pidstat -p 1234
# 显示所有统计
pidstat -p ALL
# 显示线程
pidstat -tlsof - 打开的文件
bash
# lsof - 列出打开的文件
# 查看所有打开的文件
sudo lsof
# 查看指定进程打开的文件
lsof -p 1234
# 查看指定用户打开的文件
lsof -u username
# 查看指定文件被哪个进程使用
lsof /var/log/syslog
# 查看指定端口
lsof -i :80
lsof -i :80,443
# 查看网络连接
lsof -i
# 查看 TCP 连接
lsof -i TCP
# 查看 UDP 连接
lsof -i UDP
# 查看指定协议和端口
lsof -i TCP:80
# 查看监听端口
lsof -i -P -n | grep LISTEN
# 查看被删除但仍占用空间的文件
lsof | grep deleted守护进程
守护进程概念
bash
# 守护进程(Daemon)是在后台运行的特殊进程
# 通常以 d 结尾,如 sshd、nginx、mysqld
# 守护进程特点:
# - 后台运行
# - 脱离控制终端
# - 通常以 root 权限运行
# - 有自己的进程组
# 查看守护进程
ps -eo pid,ppid,cmd | grep -E '^\s*\d+\s+1\s+'创建守护进程
bash
# 方法一:使用 nohup
nohup ./my_daemon.sh > /var/log/my_daemon.log 2>&1 &
# 方法二:使用 systemd(推荐)
# 创建服务文件 /etc/systemd/system/my_daemon.service
# [Unit]
# Description=My Daemon Service
# After=network.target
#
# [Service]
# Type=simple
# ExecStart=/path/to/my_daemon.sh
# Restart=always
# User=root
#
# [Install]
# WantedBy=multi-user.target
# 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable my_daemon
sudo systemctl start my_daemon
# 方法三:使用 screen 或 tmux
screen -dmS mysession ./my_script.sh进程资源限制
ulimit - 资源限制
bash
# ulimit - 设置或查看资源限制
# 查看所有限制
ulimit -a
# 查看特定限制
ulimit -n # 打开文件数
ulimit -u # 用户进程数
ulimit -s # 栈大小
ulimit -v # 虚拟内存
# 临时设置限制
ulimit -n 65535 # 设置打开文件数
# 永久设置(/etc/security/limits.conf)
# * soft nofile 65535
# * hard nofile 65535
# * soft nproc 65535
# * hard nproc 65535
# 查看进程限制
cat /proc/1234/limitsprlimit - 进程资源限制
bash
# prlimit - 获取或设置进程资源限制
# 查看进程限制
prlimit -p 1234
# 设置进程限制
prlimit --pid=1234 --nofile=1024:65535
# 设置多个限制
prlimit --pid=1234 --nofile=1024:65535 --nproc=1024:4096小结
本章介绍了 Linux 进程管理:
| 内容 | 命令 | 功能 |
|---|---|---|
| 进程查看 | ps, top, htop | 查看进程状态 |
| 进程控制 | kill, killall, pkill | 终止进程 |
| 优先级 | nice, renice | 调整优先级 |
| 后台任务 | jobs, fg, bg, nohup | 管理后台任务 |
| 进程查找 | pgrep, pstree | 查找进程 |
| 资源统计 | pidstat, lsof | 监控资源 |
常用命令速查
bash
# 进程查看
ps aux # 查看所有进程
top # 动态监控
htop # 增强版监控
# 进程控制
kill -9 1234 # 强制终止
killall nginx # 按名称终止
pkill -f "python script.py" # 按模式终止
# 后台任务
command & # 后台运行
nohup command & # 持久运行
jobs # 查看任务
fg %1 # 切换到前台
# 优先级
nice -n 10 command # 低优先级运行
renice 5 -p 1234 # 修改优先级下一步
下一章我们将学习 磁盘管理,了解 Linux 的磁盘分区、文件系统和存储管理。
