1. 首页 > Linux教程 > 正文

Linux教程FG097-系统进程监控与异常进程终止

本文档风哥主要介绍Linux系统进程监控与异常进程终止相关知识,包括进程基础概念、监控工具使用、异常进程处理方法,以及生产环境中的实战案例,适合系统管理员在日常运维中参考。

Part01-基础概念与理论知识

1.1 Linux进程基础概念

进程是Linux系统中正在运行的程序的实例,每个进程都有唯一的进程ID(PID)和相关的系统资源。理解进程的基本概念对于系统管理至关重要。

进程的关键属性:

  • PID(进程ID):系统分配的唯一标识符
  • PPID(父进程ID):创建该进程的父进程ID
  • 用户和组:进程运行的身份
  • 优先级:进程调度的优先级
  • 状态:运行、睡眠、停止、僵尸等
  • 资源使用:CPU、内存、I/O等

1.2 进程监控的重要性

进程监控是系统运维的核心任务之一,其重要性体现在:

  • 性能优化:识别资源消耗大的进程,优化系统性能
  • 故障排查:发现异常进程,快速定位问题
  • 安全防护:检测恶意进程,防止系统被攻击
  • 资源管理:合理分配系统资源,确保关键服务稳定运行
  • 容量规划:分析进程资源使用趋势,规划系统容量

1.3 进程状态与生命周期

Linux进程在其生命周期中会经历不同的状态:

# 进程状态说明
R (Running) – 运行中或就绪状态
S (Sleeping) – 可中断的睡眠状态
D (Disk Sleep) – 不可中断的睡眠状态(通常等待I/O)
T (Stopped) – 停止状态
Z (Zombie) – 僵尸进程(已终止但未被父进程回收)
I (Idle) – 空闲状态
风哥提示:僵尸进程(Zombie)虽然不占用系统资源,但大量僵尸进程会占用进程表空间,需要及时处理。

Part02-生产环境规划与建议

2.1 进程监控工具选择

Linux系统提供了丰富的进程监控工具,根据不同的监控需求选择合适的工具:

# 常用进程监控工具
1. ps – 查看进程快照
2. top – 实时动态监控
3. htop – 增强版top(需安装)
4. pgrep – 根据名称查找进程
5. pstree – 以树形结构显示进程
6. pidstat – 进程资源统计(sysstat包)
7. lsof – 列出进程打开的文件
8. strace – 跟踪进程系统调用

2.2 进程监控策略设计

在生产环境中,需要制定合理的进程监控策略:

# 进程监控策略设计要点

## 1. 监控频率
– 关键服务进程:实时监控
– 系统进程:每分钟检查
– 用户进程:每5分钟检查

## 2. 监控指标
– CPU使用率
– 内存使用量
– 进程状态
– 运行时间
– 打开的文件数
– 网络连接数

## 3. 告警阈值
– CPU使用率 > 80% 持续5分钟
– 内存使用率 > 90%
– 僵尸进程数量 > 10个
– 进程响应时间 > 预期值

## 4. 监控范围
– 系统关键进程(systemd, sshd等)
– 业务应用进程
– 数据库进程
– Web服务进程

2.3 异常进程终止策略

异常进程的处理需要遵循一定的策略,避免误操作导致系统故障:

# 异常进程终止策略

## 1. 识别异常进程
– CPU使用率异常高
– 内存占用异常大
– 进程状态异常(僵尸、不可中断睡眠)
– 进程行为异常(大量I/O、网络连接)

## 2. 分析进程信息
– 确认进程功能和作用
– 检查进程启动用户
– 查看进程打开的文件和端口
– 分析进程系统调用

## 3. 终止进程步骤
步骤1: 尝试正常终止(SIGTERM,信号15)
步骤2: 等待进程清理资源
步骤3: 如果无响应,强制终止(SIGKILL,信号9)
步骤4: 记录操作日志
步骤5: 检查系统状态

## 4. 注意事项
– 不要轻易终止系统关键进程
– 确认进程终止不会影响业务
– 记录终止原因和操作过程
– 分析异常原因,防止再次发生

Part03-生产环境项目实施方案

3.1 进程监控命令实操

3.1.1 ps命令 – 进程快照查看

# ps命令常用选项
# 查看所有进程
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 169424 11200 ? Ss 10:00 0:01 /usr/lib/systemd/systemd
root 2 0.0 0.0 0 0 ? S 10:00 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 10:00 0:00 [rcu_gp] # 查看指定用户的进程 $ ps -u root PID TTY TIME CMD 1 ? 00:00:01 systemd 2 ? 00:00:00 kthreadd # 查看进程树 $ ps -ejH PID PGID SID TTY TIME CMD 1 1 1 ? 00:00:01 systemd 486 486 486 ? 00:00:00 systemd-journal 510 510 510 ? 00:00:00 systemd-udevd # 按CPU使用率排序 $ ps aux --sort=-%cpu | head -10 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1234 45.2 2.1 123456 54321 ? R 10:30 5:23 /usr/bin/python3 app.py mysql 2345 12.5 5.3 234567 87654 ? S 10:31 3:45 /usr/sbin/mysqld # 按内存使用率排序 $ ps aux --sort=-%mem | head -10 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND mysql 2345 12.5 5.3 234567 87654 ? S 10:31 3:45 /usr/sbin/mysqld root 1234 45.2 2.1 123456 54321 ? R 10:30 5:23 /usr/bin/python3 app.py

3.1.2 top命令 – 实时进程监控

# top命令交互界面
$ top
top – 10:45:23 up 1 day, 2:30, 3 users, load average: 0.52, 0.58, 0.59
Tasks: 156 total, 1 running, 155 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.2 us, 2.1 sy, 0.0 ni, 92.3 id, 0.0 wa, 0.4 hi, 0.0 si
MiB Mem : 7823.5 total, 256.3 free, 3456.7 used, 4110.5 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 4096.2 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 root 20 0 123456 54321 12345 R 45.2 2.1 5:23.45 python3
2345 mysql 20 0 234567 87654 23456 S 12.5 5.3 3:45.67 mysqld
3456 nginx 20 0 145678 34567 8765 S 5.3 1.8 2:34.56 nginx

# top常用交互命令
P – 按CPU使用率排序
M – 按内存使用率排序
T – 按运行时间排序
k – 终止进程
q – 退出top
h – 显示帮助
1 – 显示所有CPU核心

# 批量模式输出
$ top -b -n 1 | head -20
top – 10:45:23 up 1 day, 2:30, 3 users, load average: 0.52, 0.58, 0.59
Tasks: 156 total, 1 running, 155 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.2 us, 2.1 sy, 0.0 ni, 92.3 id, 0.0 wa, 0.4 hi, 0.0 si

3.1.3 pgrep和pstree命令

# pgrep – 根据名称查找进程
# 查找nginx进程
$ pgrep nginx
3456
3457
3458

# 显示进程名称和PID
$ pgrep -l nginx
3456 nginx
3457 nginx
3458 nginx

# 查找指定用户的进程
$ pgrep -u root nginx
3456

# 查找并显示完整命令行
$ pgrep -a nginx
3456 nginx: master process /usr/sbin/nginx
3457 nginx: worker process
3458 nginx: worker process

# pstree – 树形显示进程
$ pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager───2*[{NetworkManager}]
├─sshd───sshd───bash───pstree
└─systemd-journal

# 显示PID
$ pstree -p
systemd(1)─┬─ModemManager(789)─┬─{ModemManager}(790)
│ └─{ModemManager}(791)
├─NetworkManager(823)─┬─{NetworkManager}(824)
│ └─{NetworkManager}(825)
├─sshd(1234)───sshd(2345)───bash(2346)───pstree(2347)
└─systemd-journal(567)

3.2 进程终止命令实操

3.2.1 kill命令 – 发送信号给进程

# kill命令常用信号
# 查看所有信号
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS

# 常用信号说明
# SIGTERM (15) – 正常终止,进程可以清理资源
# SIGKILL (9) – 强制终止,进程立即结束
# SIGHUP (1) – 挂起信号,通常用于重新加载配置

# 正常终止进程
$ kill 1234
# 或
$ kill -15 1234

# 强制终止进程
$ kill -9 1234

# 重新加载配置
$ kill -HUP 3456

# 终止进程组
$ kill -TERM -1234

3.2.2 killall和pkill命令

# killall – 根据进程名终止进程
# 终止所有nginx进程
$ killall nginx

# 强制终止所有nginx进程
$ killall -9 nginx

# 终止指定用户的进程
$ killall -u testuser nginx

# 交互式确认
$ killall -i nginx
Kill nginx(3456) ? (y/N) y
Kill nginx(3457) ? (y/N) y
Kill nginx(3458) ? (y/N) y

# pkill – 根据模式匹配终止进程
# 终止所有包含nginx的进程
$ pkill nginx

# 强制终止
$ pkill -9 nginx

# 终止指定用户的进程
$ pkill -u testuser

# 终止终端上的所有进程
$ pkill -t pts/0

# 显示将被终止的进程
$ pkill -l nginx
3456 nginx
3457 nginx
3458 nginx

3.3 进程监控脚本编写

3.3.1 进程CPU监控脚本

#!/bin/bash
# 进程CPU监控脚本
# 文件名: monitor_cpu.sh

# 设置阈值
CPU_THRESHOLD=80
PROCESS_NAME=”nginx”

# 获取进程CPU使用率
get_cpu_usage() {
local pid=$1
ps -p $pid -o %cpu –no-headers | awk ‘{print int($1)}’
}

# 主监控函数
monitor_process() {
# 查找进程PID
pids=$(pgrep $PROCESS_NAME)

if [ -z “$pids” ]; then
echo “警告: 未找到进程 $PROCESS_NAME”
return 1
fi

for pid in $pids; do
cpu_usage=$(get_cpu_usage $pid)

echo “进程 $PROCESS_NAME (PID: $pid) CPU使用率: ${cpu_usage}%”

if [ $cpu_usage -gt $CPU_THRESHOLD ]; then
echo “警告: 进程 $PROCESS_NAME (PID: $pid) CPU使用率超过阈值 ${CPU_THRESHOLD}%”
# 可以添加邮件通知或其他操作
# echo “进程CPU过高” | mail -s “CPU告警” admin@example.com
fi
done
}

# 执行监控
monitor_process

3.3.2 僵尸进程清理脚本

#!/bin/bash
# 僵尸进程清理脚本
# 文件名: clean_zombie.sh

# 查找僵尸进程
find_zombies() {
ps aux | awk ‘$8 ~ /Z/ {print $2, $11}’
}

# 统计僵尸进程数量
count_zombies() {
ps aux | awk ‘$8 ~ /Z/ {count++} END {print count}’
}

# 主清理函数
clean_zombies() {
zombie_count=$(count_zombies)

if [ “$zombie_count” -eq 0 ]; then
echo “系统没有僵尸进程”
return 0
fi

echo “发现 $zombie_count 个僵尸进程”
echo “僵尸进程列表:”
find_zombies

# 僵尸进程无法直接kill,需要终止其父进程
echo “提示: 僵尸进程需要通过终止父进程来清理”

# 查找僵尸进程的父进程
ps aux | awk ‘$8 ~ /Z/ {print $2}’ | while read pid; do
ppid=$(ps -p $pid -o ppid –no-headers)
echo “僵尸进程 $pid 的父进程PID: $ppid”
done
}

# 执行清理
clean_zombies

Part04-生产案例与实战讲解

4.1 生产环境进程监控案例

某企业Web服务器出现响应缓慢,通过进程监控发现并解决问题。

# 案例背景
– 环境:RHEL 10 Web服务器
– 问题:Web服务响应缓慢,CPU使用率高
– 工具:top, ps, pidstat

# 排查步骤

## 1. 查看系统整体状态
$ top
top – 14:30:25 up 30 days, 4:15, 2 users, load average: 5.23, 4.56, 3.89
Tasks: 245 total, 5 running, 240 sleeping, 0 stopped, 0 zombie
%Cpu(s): 85.2 us, 10.1 sy, 0.0 ni, 4.3 id, 0.0 wa, 0.4 hi, 0.0 si

## 2. 查看CPU占用最高的进程
$ ps aux –sort=-%cpu | head -10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
apache 5678 78.5 3.2 234567 87654 ? R 13:45 45:23 /usr/sbin/httpd
apache 5679 72.3 3.1 234567 86543 ? R 13:45 42:15 /usr/sbin/httpd
apache 5680 68.9 3.0 234567 85432 ? R 13:45 40:12 /usr/sbin/httpd

## 3. 查看进程详细信息
$ pidstat -p 5678 1 5
Linux 5.14.0-70.el10.x86_64 (server1) 04/06/2026 _x86_64_ (8 CPU)

02:30:25 PM UID PID %usr %system %guest %wait %CPU CPU Command
02:30:26 PM 48 5678 75.00 5.00 0.00 0.00 80.00 3 httpd
02:30:27 PM 48 5678 78.00 6.00 0.00 0.00 84.00 3 httpd
02:30:28 PM 48 5678 76.00 4.00 0.00 0.00 80.00 3 httpd

## 4. 查看进程打开的文件
$ lsof -p 5678 | head -20
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 5678 apache cwd DIR 253,0 4096 64 /etc/httpd
httpd 5678 apache rtd DIR 253,0 4096 64 /
httpd 5678 apache txt REG 253,0 523456 123 /usr/sbin/httpd
httpd 5678 apache 0u CHR 1,3 0t0 5 /dev/null
httpd 5678 apache 1u CHR 1,3 0t0 5 /dev/null
httpd 5678 apache 2w REG 253,0 1234567 456 /var/log/httpd/error_log

## 5. 查看进程网络连接
$ lsof -p 5678 -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 5678 apache 3u IPv4 12345 0t0 TCP *:http (LISTEN)
httpd 5678 apache 4u IPv4 23456 0t0 TCP server1:http->client1:54321 (ESTABLISHED)

## 6. 分析结果
发现httpd进程CPU使用率异常高,可能是:
– 恶意攻击导致大量请求
– 应用程序性能问题
– 配置不当

## 7. 解决方案
# 查看httpd访问日志
$ tail -f /var/log/httpd/access_log
192.168.1.100 – – [06/Apr/2026:14:30:25 +0800] “GET /large_file HTTP/1.1” 200 12345678

# 发现某个IP大量下载大文件
# 限制该IP访问
$ iptables -A INPUT -s 192.168.1.100 -j DROP

# 重启httpd服务
$ systemctl restart httpd

# 验证效果
$ top
top – 14:35:25 up 30 days, 4:20, 2 users, load average: 0.52, 0.58, 0.59
%Cpu(s): 5.2 us, 2.1 sy, 0.0 ni, 92.3 id, 0.0 wa, 0.4 hi, 0.0 si

4.2 异常进程排查与处理

4.2.1 CPU占用过高进程处理

# 发现CPU占用过高的进程
$ top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7890 testuser 20 0 456789 123456 23456 R 99.9 3.2 10:23.45 python3

# 查看进程详细信息
$ ps -p 7890 -o pid,ppid,user,cmd
PID PPID USER CMD
7890 6789 testuser python3 /home/testuser/script.py

# 查看进程打开的文件
$ lsof -p 7890
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python3 7890 testuser cwd DIR 253,0 4096 123 /home/testuser
python3 7890 testuser txt REG 253,0 3456789 456 /usr/bin/python3
python3 7890 testuser 0u CHR 136,0 0t0 3 /dev/pts/0

# 查看进程系统调用
$ strace -p 7890
strace: Process 7890 attached
read(0,

# 发现进程在等待输入,可能是死循环
# 联系用户确认
$ who
testuser pts/0 2026-04-06 14:00 (192.168.1.100)

# 正常终止进程
$ kill 7890

# 确认进程已终止
$ ps -p 7890

4.2.2 僵尸进程处理

# 查找僵尸进程
$ ps aux | awk ‘$8 ~ /Z/ {print}’
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
testuser 9012 0.0 0.0 0 0 ? Z 15:00 0:00 [script.sh]

# 查看僵尸进程的父进程
$ ps -p 9012 -o pid,ppid,stat,cmd
PID PPID STAT CMD
9012 8900 Z+ [script.sh]

# 查看父进程信息
$ ps -p 8900 -o pid,ppid,user,cmd
PID PPID USER CMD
8900 1 testuser /bin/bash /home/testuser/script.sh

# 僵尸进程无法直接kill,需要重启父进程或系统
# 如果父进程是系统进程,可能需要重启系统
# 如果是用户进程,可以联系用户处理

# 查看所有僵尸进程
$ ps aux | awk ‘$8 ~ /Z/ {print $2, $11}’
9012 [script.sh]
9013 [python3]

# 统计僵尸进程数量
$ ps aux | awk ‘$8 ~ /Z/ {count++} END {print “僵尸进程数量:”, count}’
僵尸进程数量: 2

4.3 进程管理最佳实践

进程管理最佳实践:

  • 定期监控:建立定期进程监控机制
  • 设置告警:对关键进程设置资源使用告警
  • 记录日志:记录进程异常和操作日志
  • 谨慎操作:终止进程前确认影响范围
  • 自动化管理:使用systemd管理关键服务进程
  • 资源限制:使用cgroups限制进程资源使用
  • 安全审计:定期审计异常进程

Part05-风哥经验总结与分享

5.1 进程监控与终止经验总结

在生产环境中进行进程监控和终止操作,需要遵循以下原则:

# 进程管理经验总结

## 1. 监控经验
– 建立基线:了解系统正常状态下的进程情况
– 持续监控:使用top/htop等工具持续监控
– 设置阈值:根据业务需求设置合理的告警阈值
– 记录历史:保存进程历史数据,便于趋势分析

## 2. 终止经验
– 先分析后操作:确认进程功能和影响
– 优先使用SIGTERM:给进程清理资源的机会
– 记录操作:记录终止原因和操作过程
– 验证效果:确认进程已终止,系统恢复正常

## 3. 常见误区
– 不要轻易kill -9:可能导致数据丢失
– 不要终止系统关键进程:可能导致系统崩溃
– 不要忽视僵尸进程:可能占用进程表空间
– 不要只看CPU:内存、I/O同样重要

5.2 进程管理检查清单

# 进程管理检查清单

## 日常检查
– [ ] 检查系统负载是否正常
– [ ] 检查CPU使用率是否正常
– [ ] 检查内存使用率是否正常
– [ ] 检查是否有僵尸进程
– [ ] 检查关键服务进程是否运行
– [ ] 检查是否有异常进程

## 异常处理
– [ ] 确认异常进程的功能和作用
– [ ] 分析异常原因
– [ ] 评估终止影响
– [ ] 选择合适的终止方式
– [ ] 记录操作过程
– [ ] 验证处理效果
– [ ] 分析根本原因

## 定期审计
– [ ] 审计进程启动权限
– [ ] 审计进程资源使用
– [ ] 审计进程网络连接
– [ ] 审计进程打开的文件
– [ ] 清理无用进程

5.3 进程管理工具推荐

根据不同的使用场景,推荐以下进程管理工具:

# 进程管理工具推荐

## 基础监控工具
1. ps – 进程快照查看,适合快速查看
2. top – 实时监控,适合持续观察
3. htop – 增强版top,界面更友好
4. pstree – 进程树查看,适合查看进程关系

## 高级监控工具
1. pidstat – 进程资源统计,适合性能分析
2. lsof – 列出打开的文件,适合排查文件占用
3. strace – 系统调用跟踪,适合深度分析
4. ltrace – 库调用跟踪,适合调试

## 进程管理工具
1. kill – 发送信号,适合精确控制
2. killall – 按名称终止,适合批量操作
3. pkill – 模式匹配终止,适合灵活操作
4. nice – 调整优先级,适合资源管理

## 自动化工具
1. systemd – 服务管理,适合系统服务
2. supervisord – 进程守护,适合应用进程
3. monit – 进程监控,适合自动化管理
4. pm2 – Node.js进程管理,适合Node.js应用

风哥提示:进程管理是系统运维的基础技能,需要不断实践和总结。建议在生产环境操作前,先在测试环境充分验证,避免误操作导致系统故障。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息