在Linux系统管理中,进程监控是一项至关重要的技能。无论是排查系统性能问题、分析资源占用,还是确保关键服务正常运行,掌握查看当前运行进程的方法都是每个Linux用户和管理员的必备能力。本文将详细解析Linux系统中查看进程的常用命令与实用技巧,帮助你全面了解进程监控的各种方法。
进程的基本概念
在深入命令之前,我们先简单了解什么是进程。进程是程序在操作系统中的一次执行实例,它拥有独立的内存空间、执行代码和系统资源。每个进程都有一个唯一的进程ID(PID),用于标识和管理。
Linux系统中的进程可以分为以下几类:
前台进程:在终端中直接运行,会占用终端输入输出
后台进程:在后台运行,不占用终端
守护进程:系统启动时自动运行的后台服务进程
僵尸进程:已终止但未被父进程回收的进程
一、ps命令:进程快照查看器
ps(Process Status)是Linux中最基础也是最常用的进程查看命令,它能提供当前系统进程的快照信息。
1.1 ps命令的基本用法
最基本的ps命令使用方式是ps aux或ps -ef,这两个组合能显示系统中所有进程的详细信息。
# 显示所有进程的详细信息
ps aux
# 或者使用另一种格式
ps -ef
ps aux输出的各列含义:
USER:进程所有者
PID:进程ID
%CPU:CPU占用率
%MEM:内存占用率
VSZ:虚拟内存大小(KB)
RSS:物理内存占用(KB)
TTY:进程运行的终端
STAT:进程状态(R=运行,S=睡眠,Z=僵尸等)
START:进程启动时间
TIME:累计CPU时间
COMMAND:进程命令及参数
1.2 ps命令的实用选项组合
ps命令提供了丰富的选项,通过组合可以精确筛选进程信息:
# 查看特定用户的进程(如查看root用户的进程)
ps -u root
# 查看特定进程ID的详细信息
ps -p 1234 -f
# 显示进程树(父子关系)
ps -ejH
# 显示进程的线程信息
ps -eLf
# 显示进程的完整命令行(包括参数)
ps auxww
# 按CPU使用率排序(降序)
ps aux --sort=-%cpu | head -10
# 按内存使用率排序(降序)
ps aux --sort=-%mem | head -10
1.3 ps命令的高级筛选技巧
ps命令可以与其他命令结合使用,实现更精确的进程筛选:
# 查找特定进程名(如查找nginx进程)
ps aux | grep nginx
# 查找特定端口相关的进程(如查找80端口)
ps aux | grep :80
# 查找特定进程名并排除grep命令本身
ps aux | grep '[n]ginx' # 使用正则表达式避免grep自身
# 查找特定目录下运行的进程
ps aux | grep '/usr/bin'
# 查找特定时间启动的进程
ps -eo pid,lstart,cmd | grep 'May 15'
1.4 ps命令输出格式自定义
使用-o选项可以自定义ps命令的输出格式:
# 自定义输出格式:PID、PPID、命令、CPU时间、内存
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu
# 显示进程的启动时间(完整格式)
ps -eo pid,lstart,cmd
# 显示进程的线程组ID和线程数
ps -eo pid,tgid,nlwp,cmd
二、top命令:实时动态进程监控
top命令提供了一个动态的、交互式的进程视图,能够实时显示系统资源使用情况和进程状态。
2.1 top命令的基本使用
直接输入top即可启动实时监控:
top
top界面分为两部分:
头部信息:显示系统负载、CPU使用率、内存/交换分区使用情况
进程列表:按CPU使用率排序的实时进程列表
2.2 top命令的常用交互命令
在top运行时,可以使用以下交互命令:
P:按CPU使用率排序(默认)
M:按内存使用率排序
T:按运行时间排序
k:终止进程(需要输入PID和信号)
u:筛选特定用户的进程
f:选择显示的字段
h:显示帮助信息
q:退出top
2.3 top命令的常用选项
# 显示所有进程(包括其他用户的)
top -u
# 显示完整命令行
top -c
# 设置刷新间隔(秒)
top -d 3
# 显示特定用户的进程
top -u username
# 显示进程ID
top -p 1234,5678
# 批处理模式(用于脚本)
top -b -n 1 > process.txt
2.4 top命令的高级用法
# 监控特定进程(多个PID用逗号分隔)
top -p 1234,5678,9012
# 监控特定用户的所有进程
top -u www-data
# 自定义显示字段(在top界面按f键选择)
# 或者使用命令行参数
top -o %CPU -O %MEM # 按CPU排序,添加内存列
# 显示线程信息
top -H -p 1234
三、htop命令:增强版top
htop是top的增强版本,提供了更友好的界面和更多功能。虽然htop不是系统自带的,但因其强大功能被广泛使用。
3.1 htop的安装
# Ubuntu/Debian系统
sudo apt install htop
# CentOS/RHEL系统
sudo yum install htop
# 或者使用epel源
sudo yum install epel-release
sudo yum install htop
3.2 htop的基本使用
htop
htop的优势:
彩色显示,更易读
支持鼠标操作
可以垂直和水平滚动查看所有进程和完整命令
支持树状视图显示进程关系
可以直接标记进程进行批量操作
3.3 htop的交互命令
F1:帮助
F2:设置(可配置显示列、排序方式等)
F3:搜索进程
F4:过滤进程(支持正则表达式)
F5:树状视图
F6:排序(选择排序字段和方向)
F7/F8:调整进程优先级(nice值)
F9:发送信号(终止进程等)
F10:退出
3.4 htop的实用技巧
# 启动时直接显示树状视图
htop -t
# 启动时直接搜索进程
htop -s NAME
# 只显示特定用户的进程
htop -u username
# 显示线程信息
htop -H
四、其他实用的进程查看命令
4.1 pstree:进程树查看
pstree以树状结构显示进程间的父子关系,便于理解进程依赖关系。
# 显示所有进程的树状结构
pstree -p
# 显示进程的详细信息(包括用户)
pstree -p -u
# 显示进程的线程信息
pstree -p -t
# 显示特定进程的子进程树
pstree -p 1234
4.2 pgrep:按名称查找进程
pgrep根据进程名查找进程ID,常用于脚本编程。
# 查找nginx进程的PID
pgrep nginx
# 查找进程名包含特定字符串的进程
pgrep -f "python script.py"
# 查找特定用户的进程
pgrep -u www-data nginx
# 显示进程名和PID
pgrep -l nginx
# 查找进程的父进程ID
pgrep -P 1234
# 使用正则表达式匹配
pgrep '^apache'
4.3 pkill:按名称终止进程
pkill根据进程名终止进程,是pgrep的”兄弟”命令。
# 终止所有nginx进程
pkill nginx
# 终止特定用户的进程
pkill -u username
# 向进程发送特定信号
pkill -15 nginx # 发送SIGTERM信号(默认)
pkill -9 nginx # 发送SIGKILL信号(强制终止)
# 终止进程名包含特定字符串的进程
pkill -f "python script.py"
4.4 kill和killall命令
# 通过PID终止进程
kill 1234
# 发送不同信号
kill -15 1234 # SIGTERM(正常终止)
kill -9 1234 # SIGKILL(强制终止)
kill -1 1234 # SIGHUP(重新加载配置)
# 通过进程名终止所有进程
killall nginx
# 终止特定用户的进程
killall -u username nginx
4.5 lsof:查看打开的文件和进程
lsof(List Open Files)可以查看进程打开的文件、网络连接等信息。
# 查看所有打开的文件和进程
lsof
# 查看特定进程打开的文件
lsof -p 1234
# 查看特定用户打开的文件
lsof -u username
# 查看特定端口相关的进程
lsof -i :80
# 查看TCP连接
lsof -i TCP
# 查看监听端口
lsof -i -sTCP:LISTEN
# 查看特定文件被哪个进程使用
lsof /var/log/syslog
4.6 netstat/ss:网络连接与进程
查看网络连接及其对应的进程:
# 查看所有网络连接(显示PID/进程名)
netstat -tulnp
# 查看TCP连接
netstat -tnp
# 查看监听端口
netstat -tlnp
# 使用ss命令(更现代的替代方案)
ss -tulnp
# 查看特定端口的连接
netstat -anp | grep :80
ss -tunp sport = :80
4.7 vmstat:系统资源统计
vmstat可以查看系统资源使用情况,包括进程、内存、CPU等。
# 显示进程、内存、CPU等信息
vmstat
# 每2秒刷新一次,共3次
vmstat 2 3
# 显示详细信息
vmstat -s
# 显示磁盘I/O信息(需要sysstat包)
vmstat -d
4.8 iostat:CPU和I/O统计
iostat主要关注CPU和磁盘I/O统计:
# 显示CPU统计
iostat -c
# 显示磁盘I/O统计
iostat -d
# 每2秒刷新一次
iostat 2
# 显示扩展统计信息
iostat -x
4.9 mpstat:CPU统计
mpstat提供每个CPU核心的详细统计:
# 显示所有CPU的统计
mpstat -P ALL
# 每2秒刷新一次
mpstat 2
4.10 pidstat:进程级资源统计
pidstat提供详细的进程级资源统计:
# 显示所有进程的CPU使用情况
pidstat -u
# 显示内存使用情况
pidstat -r
# 显示I/O统计
pidstat -d
# 显示所有信息(CPU、内存、I/O)
pidstat -urd
# 每2秒刷新一次
pidstat 2
# 显示特定进程的统计
pidstat -p 1234
4.11 sar:系统活动报告
sar(System Activity Reporter)是系统活动报告工具,可以收集、报告和保存系统活动信息。
# 显示CPU使用情况
sar -u
# 显示内存使用情况
sar -r
# 显示I/O统计
sar -b
# 显示网络统计
sar -n DEV
# 每2秒采样一次,共3次
sar -u 2 3
# 查看历史数据(如果sysstat配置了历史记录)
sar -u -f /var/log/sa/sa15
4.12 free:内存使用情况
free命令查看系统内存和交换空间使用情况:
# 显示内存使用情况(默认KB)
free
# 显示MB为单位
free -m
# 显示GB为单位
free -g
# 显示详细信息(包括缓存/缓冲区)
free -h
# 每2秒刷新一次
free -s 2
4.13 df/du:磁盘空间使用情况
# 显示文件系统磁盘使用情况
df -h
# 显示特定目录的磁盘使用情况
du -sh /var
# 显示目录下各子目录的大小
du -h --max-depth=1 /var
# 显示文件数量统计
du -i /var
4.14 uptime:系统运行时间和负载
# 显示系统运行时间、用户数和负载平均值
uptime
# 显示详细信息
uptime -p
4.15 w:当前登录用户和活动
# 显示当前登录用户和他们的活动
w
# 显示详细信息
w -f
4.16 who:当前登录用户
# 显示当前登录用户
who
# 显示登录时间
who -u
# 显示登录来源IP
who -H -u
4.17 last:登录历史记录
# 显示最近登录的用户
last
# 显示特定用户的登录历史
last username
# 显示登录失败记录
lastb
4.18 psacct:进程记账
如果安装了psacct包,可以查看进程记账信息:
# 查看进程执行统计
sa
# 查看用户进程统计
ac
4.19 systemd-cgtop:cgroup资源监控
对于使用systemd的系统:
# 显示cgroup资源使用情况
systemd-cgtop
# 显示详细信息
systemd-cgtop -n 1
4.20 systemd-cgls:cgroup树状图
# 显示cgroup树状图
systemd-cgls
# 显示特定cgroup的树状图
systemd-cgls /user.slice
五、进程监控的实用技巧
5.1 监控特定进程的资源使用
# 监控特定进程的CPU和内存使用
watch -n 1 'ps -p 1234 -o %cpu,%mem,cmd'
# 使用top监控特定进程
top -p 1234
# 使用pidstat监控
pidstat -p 1234 1
5.2 批量操作进程
# 终止所有nginx进程
pkill nginx
# 终止特定用户的进程
pkill -u username
# 终止特定进程名的进程(精确匹配)
pkill -f "python /opt/scripts/backup.py"
# 按CPU使用率排序并终止高CPU进程
ps aux --sort=-%cpu | awk 'NR>1 {print $2}' | head -5 | xargs kill
5.3 进程监控脚本示例
#!/bin/bash
# 进程监控脚本示例
# 监控特定进程的CPU使用率
MONITOR_PID=1234
THRESHOLD=80
while true; do
CPU_USAGE=$(ps -p $MONITOR_PID -o %cpu= | tr -d ' ')
if (( $(echo "$CPU_USAGE > $THRESHOLD" | bc -l) )); then
echo "警告:进程 $MONITOR_PID CPU使用率超过阈值:${CPU_USAGE}%"
# 可以添加告警或重启逻辑
fi
sleep 5
done
5.4 使用systemd监控服务进程
# 查看服务状态
systemctl status nginx
# 查看服务进程
systemctl status nginx | grep "Main PID"
# 查看服务资源使用
systemctl show nginx -p MemoryCurrent
systemctl show nginx -p CPUUsageNSec
# 查看服务日志
journalctl -u nginx -f
5.5 使用cgroups限制进程资源
# 创建cgroup
sudo cgcreate -g cpu,memory:/myapp
# 设置CPU限制(100000表示100% CPU)
echo 100000 | sudo tee /sys/fs/cgroup/cpu/myapp/cpu.cfs_quota_us
# 设置内存限制(1GB)
echo 1G | sudo tee /sys/fs/cgroup/memory/myapp/memory.limit_in_bytes
# 将进程添加到cgroup
echo 1234 | sudo tee /sys/fs/cgroup/cpu/myapp/cgroup.procs
# 使用cgroup启动进程
cgexec -g cpu,memory:myapp /path/to/program
5.6 使用perf工具分析进程性能
# 安装perf
sudo apt install linux-tools-common linux-tools-generic
# 记录进程的性能数据
perf record -p 1234 -g sleep 10
# 查看报告
perf report
# 实时监控进程性能
perf top -p 1234
5.7 使用strace跟踪系统调用
# 跟踪进程的系统调用
strace -p 1234
# 跟踪进程的系统调用和信号
strace -p 1234 -e trace=signal
# 跟踪进程的文件操作
strace -p 1234 -e trace=file
# 跟踪进程的网络操作
strace -p 1234 -e trace=network
# 将输出保存到文件
strace -p 1234 -o /tmp/strace.log
5.8 使用ltrace跟踪库函数调用
# 跟踪进程的库函数调用
ltrace -p 1234
# 跟踪特定库函数
ltrace -p 1234 -l /lib/x86_64-linux-gnu/libc.so.6
5.9 使用gdb调试进程
# 附加到运行中的进程
gdb -p 1234
# 在gdb中查看进程状态
(gdb) info threads
(gdb) bt
(gdb) info registers
5.10 使用/proc文件系统
Linux的/proc文件系统提供了丰富的进程信息:
# 查看进程信息
cat /proc/1234/status
# 查看进程的内存映射
cat /proc/1234/maps
# 查看进程打开的文件
ls -l /proc/1234/fd/
# 查看进程的环境变量
cat /proc/1234/environ
# 查看进程的命令行参数
cat /proc/1234/cmdline
# 查看进程的当前工作目录
readlink /proc/1234/cwd
# 查看进程的根目录
readlink /proc/1234/root
# 查看进程的线程信息
ls /proc/1234/task/
# 查看进程的IO统计
cat /proc/1234/io
# 查看进程的信号队列
cat /proc/1234/status | grep SigQ
5.11 使用nsenter进入进程命名空间
# 进入进程的命名空间
nsenter -t 1234 -m -u -i -n -p /bin/bash
# 在进程命名空间中执行命令
nsenter -t 1234 -m -u -i -n -p -- ls /proc/1234/root
5.12 使用unshare创建新命名空间运行进程
# 在新命名空间中运行进程
unshare -r -m -n -p -u -i /bin/bash
# 在新命名空间中运行特定程序
unshare -r -m -n -p -u -i /path/to/program
5.13 使用ipcs/ipcrm管理IPC资源
# 查看System V IPC资源
ipcs -a
# 查看共享内存
ipcs -m
# 查看信号量
ipcs -s
# 查看消息队列
ipcs -q
# 删除共享内存段
ipcrm -m 12345
# 删除信号量
ipcrm -s 12345
# 删除消息队列
ipcrm -q 12345
5.14 使用fuser查找使用文件/端口的进程
# 查找使用特定文件的进程
fuser /var/log/syslog
# 查找使用特定端口的进程
fuser -n tcp 80
# 显示进程名
fuser -v /var/log/syslog
# 终止使用文件的进程
fuser -k /var/log/syslog
# 终止使用端口的进程
fuser -k -n tcp 80
5.15 使用inotify监控进程文件变化
# 监控进程的可执行文件变化
inotifywait -m /usr/bin/nginx
# 监控进程的配置文件变化
inotifywait -m /etc/nginx/
5.16 使用auditd监控进程活动
# 安装auditd
sudo apt install auditd
# 添加监控规则
sudo auditctl -a exit,always -F arch=b64 -S execve -k process_exec
# 查看审计日志
ausearch -k process_exec
5.17 使用sysdig工具
# 安装sysdig
sudo apt install sysdig
# 捕获系统调用
sudo sysdig -p
# 只监控特定进程
sudo sysdig -p proc.name="nginx"
# 监控进程的文件操作
sudo sysdig -p fd.name contains "/etc/nginx"
5.18 使用bpftrace工具
# 安装bpftrace
sudo apt install bpftrace
# 跟踪进程执行
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_execve { printf("Process: %s\n", str(args->filename)); }'
# 跟踪进程退出
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_exit_group { printf("Process exit: %d\n", pid); }'
5.19 使用prometheus+node_exporter监控
# 安装node_exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xvfz node_exporter-*.tar.gz
cd node_exporter-*
./node_exporter
# 访问metrics
curl http://localhost:9100/metrics | grep process
5.20 使用glances工具
# 安装glances
sudo apt install glances
# 运行glances
glances
# Web模式
glances -w
# 服务器模式
glances -s
六、进程状态详解
理解进程状态对问题排查至关重要:
R (Running):进程正在运行或在运行队列中等待运行
S (Sleeping):进程正在睡眠(可中断睡眠),等待事件完成
D (Uninterruptible Sleep):进程在睡眠,通常是在等待I/O操作,不能被中断
T (Stopped):进程被停止(通常由信号SIGSTOP或SIGTSTP)
Z (Zombie):进程已终止,但其父进程尚未回收(wait())
X (Dead):进程已终止(很少见,通常不会出现在ps输出中)
七、实用场景与解决方案
7.1 场景1:系统负载突然升高
# 1. 查看整体负载
uptime
top
# 2. 按CPU排序查找高CPU进程
ps aux --sort=-%cpu | head -10
# 3. 查看进程详细信息
ps -p
# 4. 查看进程的系统调用
strace -p
# 5. 查看进程的线程
ps -T -p
# 6. 查看进程的内存映射
cat /proc/
7.2 场景2:内存泄漏排查
# 1. 查看内存使用情况
free -h
top
# 2. 按内存排序查找高内存进程
ps aux --sort=-%mem | head -10
# 3. 查看进程的内存详细信息
cat /proc/
# 4. 查看进程的内存映射
cat /proc/
# 5. 查看进程的SMAP(更详细的内存统计)
cat /proc/
# 6. 使用smem工具
smem -s rss -r | head -10
7.3 场景3:查找特定端口占用进程
# 1. 使用ss或netstat
ss -tunlp | grep :80
netstat -tunlp | grep :80
# 2. 使用lsof
lsof -i :80
# 3. 使用fuser
fuser -n tcp 80
# 4. 综合命令
ss -tunlp | grep :80 | awk '{print $7}' | cut -d= -f2
7.4 场景4:查找僵尸进程
# 1. 查找僵尸进程
ps aux | grep 'Z'
# 2. 查看僵尸进程的父进程
ps -eo ppid,pid,stat,cmd | grep 'Z'
# 3. 终止父进程(如果必要)
kill -15
# 4. 如果父进程不响应,使用SIGKILL
kill -9
7.5 场景5:查找进程的完整路径
# 1. 使用ps
ps -p
# 2. 使用/proc
readlink /proc/
# 3. 使用which(如果知道进程名)
which nginx
# 4. 使用whereis
whereis nginx
7.6 场景6:监控进程的系统调用
# 1. 使用strace
strace -p
# 2. 只跟踪特定系统调用
strace -p
# 3. 跟踪文件操作
strace -p
# 4. 跟踪网络操作
strace -p
# 5. 跟踪信号
strace -p
# 6. 将输出保存到文件
strace -p
7.7 场景7:监控进程的库函数调用
# 1. 使用ltrace
ltrace -p
# 2. 只跟踪特定库函数
ltrace -p
# 3. 跟踪特定函数
ltrace -p
7.8 场景8:调试运行中的进程
# 1. 使用gdb附加到进程
gdb -p
# 2. 在gdb中查看进程状态
(gdb) info threads
(gdb) bt
(gdb) info registers
(gdb) print some_variable
# 3. 修改进程状态(谨慎使用)
(gdb) set variable = new_value
# 4. 继续执行
(gdb) continue
7.9 场景9:查看进程的线程信息
# 1. 使用ps查看线程
ps -T -p
# 2. 使用top查看线程(按H)
top -H -p
# 3. 查看/proc中的线程
ls /proc/
# 4. 使用pstree查看线程
pstree -p
# 5. 使用htop查看线程(按F2配置)
htop -H -p
7.10 场景10:进程的启动时间与运行时长
# 1. 查看进程启动时间
ps -p
# 2. 查看进程运行时长
ps -p
# 3. 使用/proc
cat /proc/
# 4. 使用stat命令
stat /proc/
7.11 场景11:进程的父进程与子进程
# 1. 查看父进程
ps -o ppid= -p
# 2. 查看子进程
ps --ppid=
# 3. 使用pstree
pstree -p
# 4. 查看进程树
ps -ejH | grep
7.12 场景12:进程的I/O统计
# 1. 查看进程的I/O统计(需要root)
cat /proc/
# 2. 使用pidstat
pidstat -d -p
# 3. 使用iotop(需要root)
sudo iotop -p
# 4. 使用/proc
cat /proc/
7.13 场景13:进程的信号处理
# 1. 查看进程的信号掩码
cat /proc/
# 2. 查看进程的信号队列
cat /proc/
# 3. 发送信号
kill -<信号编号>
# 4. 常用信号
# 1) SIGHUP 重新加载配置
# 2) SIGINT 终止(Ctrl+C)
# 15) SIGTERM 正常终止
# 9) SIGKILL 强制终止
# 19) SIGSTOP 停止
# 18) SIGCONT 继续
7.14 场景14:进程的环境变量
# 1. 查看进程的环境变量
cat /proc/
# 2. 使用ps
ps e -p
# 3. 使用gdb
gdb -p
7.15 场景15:进程的文件描述符
# 1. 查看进程打开的文件描述符
ls -l /proc/
# 2. 查看文件描述符的详细信息
cat /proc/
# 3. 使用lsof
lsof -p
# 4. 查看特定文件描述符指向的文件
readlink /proc/
7.16 场景16:进程的命名空间
# 1. 查看进程的命名空间
ls -l /proc/
# 2. 查看命名空间ID
readlink /proc/
readlink /proc/
# 3. 进入进程的命名空间
nsenter -t
7.17 场景17:进程的cgroup信息
# 1. 查看进程的cgroup
cat /proc/
# 2. 查看cgroup的资源限制
cat /sys/fs/cgroup/cpu/
cat /sys/fs/cgroup/memory/
# 3. 使用systemd-cgtop
systemd-cgtop
# 4. 使用systemd-cgls
systemd-cgls
7.18 场景18:进程的seccomp状态
# 1. 查看进程的seccomp状态
cat /proc/
# 2. seccomp值含义:
# 0: SECCOMP_MODE_DISABLED
# 1: SECCOMP_MODE_STRICT
# 2: SECCOMP_MODE_FILTER
7.19 场景19:进程的capabilities
# 1. 查看进程的capabilities
cat /proc/
# 2. 使用capsh解析
capsh --decode=$(cat /proc/
7.20 场景20:进程的AppArmor/SELinux状态
# 1. 查看AppArmor状态
cat /proc/
# 2. 查看SELinux上下文
ls -Z /proc/
# 3. 使用aa-status
sudo aa-status
八、进程监控的最佳实践
8.1 建立监控体系
# 1. 使用systemd服务监控关键进程
sudo systemctl enable nginx
sudo systemctl start nginx
# 2. 配置自动重启
sudo systemctl edit nginx
# 添加:
# [Service]
# Restart=always
# RestartSec=5
# 3. 使用monit监控
sudo apt install monit
# 配置/etc/monit/conf.d/nginx
check process nginx with pidfile /var/run/nginx.pid
start program = "/etc/init.d/nginx start"
stop program = "/etc/init.d/nginx stop"
if cpu > 80% for 5 cycles then alert
8.2 日志与告警
# 1. 使用journalctl查看进程日志
journalctl -u nginx -f
# 2. 使用rsyslog收集日志
# /etc/rsyslog.d/50-nginx.conf
:msg, contains, "nginx" /var/log/nginx.log
# 3. 使用logrotate管理日志
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid)
fi
endscript
}
8.3 性能分析与调优
# 1. 使用perf分析性能
perf record -g -p
perf report
# 2. 使用valgrind检测内存泄漏
valgrind --leak-check=full ./program
# 3. 使用gprof分析性能
gcc -pg program.c -o program
./program
gprof program gmon.out > analysis.txt
8.4 自动化脚本示例
#!/bin/bash
# 进程监控自动化脚本
# 配置
PROCESS_NAME="nginx"
LOG_FILE="/var/log/process_monitor.log"
ALERT_EMAIL="admin@example.com"
CPU_THRESHOLD=80
MEM_THRESHOLD=80
# 日志函数
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}
# 检查进程是否存在
check_process() {
if pgrep -x $PROCESS_NAME > /dev/null; then
log "进程 $PROCESS_NAME 正常运行"
return 0
else
log "进程 $PROCESS_NAME 未运行,尝试重启"
sudo systemctl restart $PROCESS_NAME
echo "进程 $PROCESS_NAME 已重启" | mail -s "Process Alert" $ALERT_EMAIL
return 1
fi
}
# 检查资源使用
check_resources() {
PID=$(pgrep -x $PROCESS_NAME)
if [ -n "$PID" ]; then
CPU=$(ps -p $PID -o %cpu= | tr -d ' ')
MEM=$(ps -p $PID -o %mem= | tr -d ' ')
if (( $(echo "$CPU > $CPU_THRESHOLD" | bc -l) )); then
log "警告:$PROCESS_NAME CPU使用率过高:${CPU}%"
echo "CPU使用率过高:${CPU}%" | mail -s "CPU Alert" $ALERT_EMAIL
fi
if (( $(echo "$MEM > $MEM_THRESHOLD" | bc -l) )); then
log "警告:$PROCESS_NAME 内存使用率过高:${MEM}%"
echo "内存使用率过高:${MEM}%" | mail -s "Memory Alert" $ALERT_EMAIL
fi
fi
}
# 主循环
while true; do
check_process
check_resources
sleep 60
done
九、总结
Linux系统提供了丰富的工具来查看和监控进程,从基础的ps、top到高级的perf、bpftrace,每个工具都有其特定的使用场景。掌握这些工具的组合使用,能够帮助我们快速定位问题、分析性能瓶颈、优化系统资源。
在实际工作中,建议:
从基础开始:熟练掌握ps、top、htop等基础工具
组合使用:根据需求组合多个工具,如ps | grep、top -p等
深入分析:遇到复杂问题时,使用strace、perf等工具深入分析
建立监控:对关键进程建立持续监控和告警机制
定期审查:定期审查进程资源使用情况,及时发现异常
通过本文的详细解析,相信你已经对Linux进程监控有了全面的了解。在实际操作中,多练习、多总结,你将能够熟练运用这些工具解决各种系统问题。