Skip to content

进程管理

本章将介绍 Linux 进程管理,包括进程查看、进程控制、后台任务管理、进程优先级等内容,帮助你有效管理系统资源。

进程概述

什么是进程?

进程是程序在执行过程中的实例,包含程序代码、数据、系统资源和执行状态。

mermaid
graph TD
    A[程序] --> B[进程]
    B --> C[代码段]
    B --> D[数据段]
    B --> E[堆栈]
    B --> F[进程控制块 PCB]
    
    F --> F1[PID]
    F --> F2[状态]
    F --> F3[优先级]
    F --> F4[资源]

进程状态

状态说明标识
运行正在执行或等待 CPUR
睡眠等待资源或事件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 1234

ps 输出解释

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 -11

top - 动态监控

基本使用

bash
# top - 动态显示进程状态

# 启动 top
top

# 指定刷新间隔(秒)
top -d 5

# 监控指定用户
top -u username

# 监控指定 PID
top -p 1234,5678

# 显示完整命令行
top -c

# 批处理模式(输出到文件)
top -b -n 1 > top_output.txt

top 交互命令

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 nginx

pkill - 按模式终止

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 nginx

nice 和 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.pid

jobs - 查看后台任务

bash
# jobs - 查看当前 Shell 的后台任务

jobs
# 输出:[1]+  Running    sleep 100 &

# 显示 PID
jobs -l
# 输出:[1]+ 12345 Running    sleep 100 &

# 只显示 PID
jobs -p

# 显示运行中的任务
jobs -r

# 显示已停止的任务
jobs -s

fg 和 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 nginx

pstree - 进程树

bash
# pstree - 以树形显示进程

# 显示进程树
pstree

# 显示 PID
pstree -p

# 显示完整命令行
pstree -a

# 显示用户
pstree -u

# 显示指定进程的子进程
pstree -p 1234

# 高亮当前进程
pstree -h

# 压缩相同的分支
pstree -c

pidstat - 进程统计

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 -t

lsof - 打开的文件

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/limits

prlimit - 进程资源限制

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 的磁盘分区、文件系统和存储管理。