Linux进程与系统资源管理实战
一、进程概念与管理基础
1.1 进程的定义
在Linux操作系统中,进程是指正在运行中的程序实例。每个进程都拥有独立的虚拟内存空间,并占用一定的系统资源。当用户执行某个程序时,操作系统会为该程序创建一个进程,并分配唯一的进程标识符(PID)。
进程与程序的区别在于:程序是静态的代码集合,而进程是动态运行的实体。程序位于磁盘中,而进程则存在于内存中,由操作系统进行调度和管理。
1.2 进程管理的核心功能
系统管理员需要掌握进程管理技能,主要包括:
- 监控系统运行状态:通过查看进程信息判断系统是否正常运行
- 识别异常进程:发现可疑或未授权的进程
- 终止问题进程:处理占用资源过多或无响应的进程
二、进程查看命令详解
2.1 ps命令详解
ps命令用于静态查看系统进程信息,支持多种参数格式。
[admin@server ~]$ ps aux
#查看所有进程信息(BSD风格语法)
[admin@server ~]$ ps -le
#查看所有进程(标准Linux格式)
常用参数说明:
a 显示当前终端下的所有进程
u 显示进程归属用户及内存占用详情
x 显示无关联终端的进程
e 显示详细格式信息
l 以长格式输出
典型输出示例:
[admin@server ~]$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.8 0.1 192340 4120 ? Ss 08:15 0:05 /usr/lib/systemd/systemd --switched-root
root 2 0.0 0.0 0 0 ? S 08:15 0:00 [kthreadd]
字段含义解析:
| 字段 | 说明 |
|---|---|
| USER | 进程所属用户 |
| PID | 进程唯一标识符 |
| %CPU | CPU资源占用比例 |
| %MEM | 物理内存占用比例 |
| VSZ | 虚拟内存大小(KB) |
| RSS | 实际物理内存占用(KB) |
| TTY | 终端设备标识 |
| STAT | 进程运行状态 |
| START | 启动时间 |
| TIME | CPU累计占用时间 |
| COMMAND | 执行命令 |
进程状态详解:
- D:不可中断的睡眠状态(通常等待I/O操作)
- R:正在运行或可运行状态
- S:可唤醒的睡眠状态
- T:暂停或追踪状态
- Z:僵尸进程(已终止但未被回收)
- W:内存交换状态(2.6内核后已失效)
- <:高优先级进程
- N:低优先级进程
- s:包含子进程
- l:多线程模式
- +:位于后台运行
标准格式输出示例:
[admin@server ~]$ ps -le
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 48200 ep_pol ? 00:00:05 systemd
1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd
各字段说明:
- F:进程标志位(1=可复制但不可执行,4=超级用户权限)
- S:进程状态
- UID:进程所属用户ID
- PID:进程ID
- PPID:父进程ID
- C:CPU使用率
- PRI:调度优先级(数值越小优先级越高)
- NI:Nice值(影响优先级)
- SZ:占用内存大小
- WCHAN:等待事件类型
- TTY:终端设备
- TIME:CPU时间
- CMD:命令名称
2.2 top动态监控命令
top命令以动态方式实时显示系统进程状态,默认每3秒刷新一次。
top [参数]
-d 秒数 指定刷新间隔时间
-b 批处理模式输出
-n 次数 指定执行次数
-p PID 仅监控指定进程
-s 安全模式运行
-u 用户名 仅显示指定用户的进程
交互模式常用命令:
?或h 显示帮助信息
P 按CPU使用率排序(默认)
M 按内存使用率排序
N 按PID排序
T 按运行时间排序
k 终止指定进程(输入PID和信号)
r 重新设置进程优先级
q 退出top界面
输出内容示例:
top - 14:25:33 up 2:18, 2 users, load average: 0.15, 0.12, 0.08
Tasks: 185 total, 1 running, 184 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.2 us, 0.8 sy, 0.0 ni, 97.5 id, 0.3 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem : 2048000 total, 945280 free, 524288 used, 578432 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1572864 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
892 root 20 0 328420 7184 5692 S 1.0 0.4 0:15.32 vmtoolsd
10248 root 20 0 165840 2536 1724 R 0.8 0.1 0:08.21 top
815 root 20 0 22120 1420 1024 S 0.3 0.1 0:02.15 irqbalance
系统状态信息解读:
第一行(任务队列信息):
| 项目 | 说明 |
|---|---|
| 14:25:33 | 系统当前时间 |
| up 2:18 | 系统运行时长 |
| 2 users | 当前登录用户数 |
| load average | 1/5/15分钟平均负载 |
第二行(进程统计):
| 项目 | 说明 |
|---|---|
| 185 total | 进程总数 |
| 1 running | 运行中进程数 |
| 184 sleeping | 睡眠进程数 |
| 0 stopped | 暂停进程数 |
| 0 zombie | 僵尸进程数 |
第三行(CPU状态):
| 项目 | 说明 |
|---|---|
| 1.2 us | 用户空间占用CPU |
| 0.8 sy | 内核空间占用CPU |
| 0.0 ni | 调整过优先级的进程CPU |
| 97.5 id | 空闲CPU百分比 |
| 0.3 wa | 等待I/O的CPU |
| 0.2 si | 软中断CPU |
| 0.0 hi | 硬中断CPU |
| 0.0 st | 虚拟机偷取CPU |
第四行(内存状态):
| 项目 | 说明 |
|---|---|
| 2048000 total | 物理内存总量 |
| 945280 free | 可用内存 |
| 524288 used | 已用内存 |
| 578432 buff/cache | 缓存内存 |
第五行(交换分区):
| 项目 | 说明 |
|---|---|
| 2097148 total | 交换分区总量 |
| 2097148 free | 可用交换分区 |
| 0 used | 已用交换分区 |
| 1572864 avail Mem | 可用内存(含缓存) |
进程信息区域字段说明:
- VIRT:进程使用的虚拟内存总量
- RES:进程使用的实际物理内存
- SHR:共享内存大小
- S:进程状态
使用示例:
[admin@server ~]$ top -p 7892
#仅查看PID为7892的进程
top - 15:42:18 up 3:35, 1 user, load average: 0.03, 0.05, 0.04
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2048000 total, 812400 free, 488920 used, 746680 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1398000 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7892 root 20 0 245680 5620 3584 S 0.0 0.3 0:00.12 nginx
在交互界面中按"k"可终止进程:
[admin@server ~]$ top -p 8234
top - 16:05:42 up 4:58, 1 user, load average: 0.06, 0.04, 0.03
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.8 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2048000 total, 809920 free, 490240 used, 747840 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1397072 avail Mem
PID to signal/kill [default pid = 8234] <- 按k键后提示输入进程PID
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8234 root 20 0 245680 5592 3568 S 0.0 0.3 0:00.09 nginx
若要将完整进程列表保存到文件:
[admin@server ~]$ top -b -n 1 > /tmp/process_list.log
#批处理模式执行1次并重定向到文件
2.3 pstree进程树命令
pstree [参数]
-p 显示进程PID
-u 显示进程所属用户
三、进程终止操作
3.1 进程信号机制
Linux系统支持多种信号,可通过"kill -l"或"man 7 signal"查看完整列表。
[admin@server ~]$ 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 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
常用信号说明:
| 编号 | 信号名 | 功能描述 |
|---|---|---|
| 1 | SIGHUP | 重新读取配置文件并重启 |
| 2 | SIGINT | 终止前台进程(Ctrl+C) |
| 8 | SIGFPE | 算术运算错误 |
| 9 | SIGKILL | 强制终止进程(不可阻断) |
| 14 | SIGALRM | 定时器信号 |
| 15 | SIGTERM | 正常终止进程(默认) |
| 18 | SIGCONT | 恢复暂停的进程 |
| 19 | SIGSTOP | 暂停前台进程(Ctrl+Z) |
3.2 kill命令用法
kill [参数] PID
实例演示:
[admin@server ~]$ ps -ef | grep "nginx"
root 3156 1 3 18:45 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 3160 3156 0 18:45 ? 00:00:02 nginx: worker process
nginx 3161 3156 0 18:45 ? 00:00:02 nginx: worker process
nginx 3162 3156 0 18:45 ? 00:00:02 nginx: worker process
root 3178 2045 0 18:46 pts/0 00:00:00 grep --color=auto nginx
[admin@server ~]$ kill -1 3156
#发送SIGHUP信号使nginx主进程重新加载配置
进程暂停示例:
[admin@server ~]$ vim /tmp/demo.txt
#编辑文件,不要退出
[admin@server ~]$ ps aux | grep "vim"
root 4521 1.2 0.2 148920 5248 pts/0 S+ 18:52 0:00 vim /tmp/demo.txt
root 4535 0.0 0.0 112408 964 pts/1 R+ 18:53 0:00 grep --color=auto vim
[admin@server ~]$ ps aux | grep "vim" | grep -v "grep"
root 4521 0.9 0.2 148920 5248 pts/0 S+ 18:52 0:00 vim /tmp/demo.txt
#从另一终端查看进程状态,S+表示睡眠状态且位于后台
[admin@server ~]$ kill -19 4521
[admin@server ~]$ ps aux | grep "vim" | grep -v "grep"
root 4521 0.2 0.2 148920 5248 pts/0 T 18:52 0:00 vim /tmp/demo.txt
#进程状态变为T(暂停),原终端中vim已被暂停
#如需恢复可使用kill -18 4521,否则使用kill -9 4521强制终止
3.3 killall命令
killall [参数] [信号] 进程名
-i 交互模式,杀死前确认
-I 忽略大小写
实例:
[admin@server ~]$ ps aux | grep "sshd"
root 1340 0.0 0.2 113280 4380 ? Ss 17:25 0:00 /usr/sbin/sshd -D
root 1920 0.0 0.3 164120 6180 ? Ss 17:25 0:00 sshd: root@pts/0
root 2485 0.0 0.3 164240 6240 ? Ss 18:12 0:00 sshd: root@pts/1
root 2621 0.0 0.0 112840 968 pts/0 S+ 18:22 0:00 grep --color=auto sshd
[admin@server ~]$ ps aux | grep "sshd" | grep -v "grep"
root 1340 0.0 0.2 113280 4380 ? Ss 17:25 0:00 /usr/sbin/sshd -D
root 1920 0.0 0.3 164120 6180 ? Ss 17:25 0:00 sshd: root@pts/0
root 2485 0.0 0.3 164240 6240 ? Ss 18:12 0:00 sshd: root@pts/1
[admin@server ~]$ killall -i sshd
杀死 sshd(1340) ? (y/N) n
杀死 sshd(1920) ? (y/N) n
杀死 sshd(2485) ? (y/N) y
3.4 pkill命令
pkill命令同样按进程名终止进程,还支持按终端号踢出用户。
pkill [参数] [信号] 进程名
-t 终端号 按终端号终止用户会话
实例:
[admin@server ~]$ pkill -9 -t pts/2
#强制终止从pts/2终端连接的所有进程
四、后台任务管理
4.1 后台任务概念
前台进程指当前终端可交互操作的进程,后台进程则自动运行但无法用Ctrl+C终止,需使用fg/bg命令管理。
注意事项:
- 每个终端仅管理自身启动的后台任务
- 后台命令需能持续运行,否则会快速结束无法管理
- 需交互输入的命令放入后台会自动暂停
4.2 后台任务添加方法
方法一:命令后加"&"符号
[admin@server ~]$ find / -name "*.log" &
[2] 5847
#系统分配工作号[2]和进程号5847
[admin@server ~]$ ps -ef |grep find
root 5872 5830 0 21:05 pts/2 00:00:00 grep --color=auto find
[2]+ 完成 find / -name "*.log"
方法二:执行中按Ctrl+Z快捷键
[admin@server ~]$ htop
#执行过程中按下Ctrl+z
[1]+ 已停止 htop
#命令被放入后台,工作号1,状态暂停
#虽然htop未结束,但已释放终端控制权
4.3 后台任务管理命令
查看后台任务:
jobs [-l]
-l 显示进程PID
恢复到前台执行:
fg %工作号
#工作号前%的可省略
恢复到后台执行:
bg %工作号
4.4 后台任务持久化运行
后台任务默认与终端绑定,退出登录后任务会终止。如需持久运行可采用以下方法:
方法一:加入系统启动脚本
将命令添加到/etc/rc.local,缺点是服务器重启才会执行。
方法二:使用定时任务
通过cron定时任务执行,不依赖登录终端。
方法三:nohup命令
nohup可让进程在终端退出后继续运行:
[admin@server ~]$ nohup [command] &
[admin@server ~]$ nohup find / -name nginx.conf &
[1] 6294
[admin@server ~]$ nohup: 忽略输入并把输出追加到"nohup.out"
五、系统资源监控工具
5.1 vmstat监控系统资源
vmstat [刷新间隔] [刷新次数]
[admin@server ~]$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1092872 2140 348160 0 0 315 23 105 225 1 2 96 0 0
[admin@server ~]$ vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us us id wa st
1 0 0 1093128 2140 348160 0 0 310 22 104 222 1 2 96 0 0
0 0 0 1093128 2140 348160 0 0 0 0 70 84 0 0 99 0 0
0 0 0 1093128 2140 348160 0 0 0 0 44 56 0 0 100 0 0
输出字段说明:
进程信息:
- r:等待运行的进程数
- b:不可唤醒的进程数
内存信息:
- swpd:虚拟内存使用量
- free:空闲内存
- buff:缓冲区内存
- cache:缓存区内存
交换分区:
- si:从磁盘换入内存的数据量
- so:换出到磁盘的数据量
I/O信息:
- bi:读入块设备的数据量
- bo:写入块设备的数据量
系统信息:
- in:每秒中断次数
- cs:每秒上下文切换次数
CPU信息:
- us:用户空间CPU占比
- sy:内核空间CPU占比
- id:空闲CPU占比
- wa:等待I/O的CPU占比
- st:虚拟机偷取CPU占比
5.2 dmesg查看内核信息
[admin@server ~]$ dmesg | grep CPU
#查看CPU相关内核信息
[admin@server ~]$ dmesg | grep eth0
#查看第一块网卡信息
5.3 free查看内存使用情况
free [参数]
-b 字节为单位
-k KB为单位(默认)
-m MB为单位
-g GB为单位
[admin@server ~]$ free
total used free shared buff/cache available
Mem: 2048000 445824 1094656 13312 507520 1441536
Swap: 2097148 0 2097148
5.4 查看CPU详细信息
[admin@server ~]$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 85
model name : Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz
stepping : 1
microcode : 0x1
cpu MHz : 2400.168
cache size : 35840 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec arat
bogomips : 4800.33
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:
5.5 查看登录用户信息
w命令查看当前登录用户:
[admin@server ~]$ w
05:32:15 up 1:45, 1 user, load average: 0.02, 0.03, 0.06
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
admin pts/0 192.168.100.50 03:48 0.00s 1.12s 0.05s w
字段说明:
- FROM:登录来源IP地址
- LOGIN@:登录时间
- IDLE:闲置时间
- JCPU:该终端所有进程CPU时间
- PCPU:当前进程CPU时间
- WHAT:当前执行的命令
who命令简化版:
[admin@server ~]$ who
admin pts/0 2024-03-15 03:48 (192.168.100.50)
#用户名 终端 登录时间 来源IP
5.6 uptime查看系统运行时间
[admin@server ~]$ uptime
05:48:22 up 2:01, 1 user, load average: 0.01, 0.02, 0.05
显示内容与top命令第一行相同,包含系统运行时间、用户数、平均负载。
5.7 查看系统版本信息
uname [参数]
-a 查看全部信息
-r 查看内核版本
-s 查看内核名称
判断系统架构:
[admin@server ~]$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c8d4e2f1a3b9, stripped
该输出显示为64位x86-64架构系统。