Linux系统如何查看当前运行的进程 常用命令与实用技巧解析

Linux系统如何查看当前运行的进程 常用命令与实用技巧解析

在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 -f

# 4. 查看进程的系统调用

strace -p

# 5. 查看进程的线程

ps -T -p

# 6. 查看进程的内存映射

cat /proc//maps

7.2 场景2:内存泄漏排查

# 1. 查看内存使用情况

free -h

top

# 2. 按内存排序查找高内存进程

ps aux --sort=-%mem | head -10

# 3. 查看进程的内存详细信息

cat /proc//status

# 4. 查看进程的内存映射

cat /proc//maps

# 5. 查看进程的SMAP(更详细的内存统计)

cat /proc//smaps

# 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 -o cmd

# 2. 使用/proc

readlink /proc//exe

# 3. 使用which(如果知道进程名)

which nginx

# 4. 使用whereis

whereis nginx

7.6 场景6:监控进程的系统调用

# 1. 使用strace

strace -p

# 2. 只跟踪特定系统调用

strace -p -e trace=open,read,write

# 3. 跟踪文件操作

strace -p -e trace=file

# 4. 跟踪网络操作

strace -p -e trace=network

# 5. 跟踪信号

strace -p -e trace=signal

# 6. 将输出保存到文件

strace -p -o /tmp/strace.log

7.7 场景7:监控进程的库函数调用

# 1. 使用ltrace

ltrace -p

# 2. 只跟踪特定库函数

ltrace -p -l /lib/x86_64-linux-gnu/libc.so.6

# 3. 跟踪特定函数

ltrace -p -e malloc+free

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

# 4. 使用pstree查看线程

pstree -p

# 5. 使用htop查看线程(按F2配置)

htop -H -p

7.10 场景10:进程的启动时间与运行时长

# 1. 查看进程启动时间

ps -p -o lstart

# 2. 查看进程运行时长

ps -p -o etime

# 3. 使用/proc

cat /proc//stat | awk '{print $22}'

# 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//io

# 2. 使用pidstat

pidstat -d -p 1

# 3. 使用iotop(需要root)

sudo iotop -p

# 4. 使用/proc

cat /proc//io

7.13 场景13:进程的信号处理

# 1. 查看进程的信号掩码

cat /proc//status | grep SigBlk

# 2. 查看进程的信号队列

cat /proc//status | grep SigQ

# 3. 发送信号

kill -<信号编号>

# 4. 常用信号

# 1) SIGHUP 重新加载配置

# 2) SIGINT 终止(Ctrl+C)

# 15) SIGTERM 正常终止

# 9) SIGKILL 强制终止

# 19) SIGSTOP 停止

# 18) SIGCONT 继续

7.14 场景14:进程的环境变量

# 1. 查看进程的环境变量

cat /proc//environ | tr '\0' '\n'

# 2. 使用ps

ps e -p

# 3. 使用gdb

gdb -p -ex "show environment" -batch

7.15 场景15:进程的文件描述符

# 1. 查看进程打开的文件描述符

ls -l /proc//fd/

# 2. 查看文件描述符的详细信息

cat /proc//fdinfo/

# 3. 使用lsof

lsof -p

# 4. 查看特定文件描述符指向的文件

readlink /proc//fd/

7.16 场景16:进程的命名空间

# 1. 查看进程的命名空间

ls -l /proc//ns/

# 2. 查看命名空间ID

readlink /proc//ns/mnt

readlink /proc//ns/net

# 3. 进入进程的命名空间

nsenter -t -m -u -i -n -p /bin/bash

7.17 场景17:进程的cgroup信息

# 1. 查看进程的cgroup

cat /proc//cgroup

# 2. 查看cgroup的资源限制

cat /sys/fs/cgroup/cpu//cpu.cfs_quota_us

cat /sys/fs/cgroup/memory//memory.limit_in_bytes

# 3. 使用systemd-cgtop

systemd-cgtop

# 4. 使用systemd-cgls

systemd-cgls

7.18 场景18:进程的seccomp状态

# 1. 查看进程的seccomp状态

cat /proc//status | grep Seccomp

# 2. seccomp值含义:

# 0: SECCOMP_MODE_DISABLED

# 1: SECCOMP_MODE_STRICT

# 2: SECCOMP_MODE_FILTER

7.19 场景19:进程的capabilities

# 1. 查看进程的capabilities

cat /proc//status | grep Cap

# 2. 使用capsh解析

capsh --decode=$(cat /proc//status | grep CapEff | awk '{print $2}')

7.20 场景20:进程的AppArmor/SELinux状态

# 1. 查看AppArmor状态

cat /proc//attr/current

# 2. 查看SELinux上下文

ls -Z /proc//exe

# 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 sleep 30

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进程监控有了全面的了解。在实际操作中,多练习、多总结,你将能够熟练运用这些工具解决各种系统问题。

相关推荐

怎么查询车主是不是本人?通过车牌号核查车主信息的4个方法
女足世界杯丨中国女足出线分析:悬念重重 需放手一搏
关于外公外婆广府人和客家人的叫法都是源于古汉语