一、进程查看命令
1. ps (Process Status) - 进程状态
常用选项组合:
ps aux # 查看所有用户的所有进程
ps -ef # 完整格式显示所有进程
ps -eLf # 显示线程信息
ps -o pid,ppid,cmd,%mem,%cpu --sort=-%mem | head # 自定义输出格式并按内存排序
ps aux 输出字段含义:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 169316 13104 ? Ss 08:30 0:01 /sbin/init
- USER:进程所有者
- PID (Process ID):进程ID
- %CPU:CPU使用率百分比
- %MEM:内存使用率百分比
- VSZ (Virtual Memory Size):虚拟内存大小(KB)
- RSS (Resident Set Size):物理内存大小(KB)
- TTY:进程关联的终端
?:没有关联终端(后台进程)pts/0:伪终端tty1:物理终端- STAT (Process State):进程状态
R(Running):运行中S(Sleeping):睡眠中(可中断)D(Uninterruptible Sleep):不可中断睡眠(通常等待I/O)T(Stopped):停止状态Z(Zombie):僵尸进程<:高优先级N:低优先级s:会话首进程+:前台进程组- START:进程启动时间
- TIME:进程占用CPU总时间
- COMMAND:进程执行的命令
2. uptime - 系统运行时间
$ uptime
09:15:30 up 15 days, 3:25, 3 users, load average: 0.05, 0.10, 0.15
输出含义:
09:15:30:当前系统时间up 15 days, 3:25:系统已运行15天3小时25分钟3 users:当前登录用户数load average: 0.05, 0.10, 0.15:系统平均负载(1分钟、5分钟、15分钟)
平均负载说明:
- 单核CPU:1.00表示100%负载
- 四核CPU:4.00表示100%负载
- 小于CPU核心数表示系统空闲
3. top (Table of Processes) - 动态进程查看
top界面各区域含义:
top - 09:20:15 up 15 days, 3:30, 3 users, load average: 0.05, 0.08, 0.12
Tasks: 250 total, 1 running, 249 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.5 us, 0.5 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7845.8 total, 256.1 free, 4096.2 used, 3493.5 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 3450.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 mysql 20 0 3284676 1.2g 23456 S 2.3 15.6 150:30.25 mysqld
系统概要信息:
- Tasks:进程统计(总数、运行、睡眠、停止、僵尸)
- %Cpu(s):CPU使用情况
- us (user):1.5% - 用户空间进程占用 CPU 时间比例
- sy (system):0.5% - 内核空间占用 CPU 时间比例
- 操作系统内核处理系统调用、中断、进程调度等消耗的 CPU
- ni (nice):0.0% - 被调整过优先级的用户进程占用 CPU
- 使用
nice命令调整优先级的进程消耗的 CPU
- 使用
- id (idle):98.0% - CPU 空闲时间比例
- 这是最关键指标:表示系统有 98% 的 CPU 资源处于空闲状态
- 说明系统负载很轻,有充足的 CPU 资源储备
- wa (I/O wait):0.0% - CPU 等待 I/O 完成的时间比例
- 表示没有进程在等待磁盘、网络等 I/O 操作
- 在您的五层架构中,如果这个值高,可能表示存储服务或数据库有 I/O 瓶颈
- hi (hardware interrupts):0.0% - 处理硬件中断时间
- 来自硬盘、网卡等硬件设备的中断处理
- si (software interrupts):0.0% - 处理软件中断时间
- 系统内部的软件中断处理
- st (steal time):0.0% - 被虚拟化平台"偷走"的时间
进程列表字段:
- PR (Priority):优先级
- NI (Nice):nice值(-20到19,值越小优先级越高)
- VIRT (Virtual Memory):虚拟内存大小
- RES (Resident Memory):物理内存大小
- SHR (Shared Memory):共享内存大小
top交互命令:
h # 显示帮助
P (大写) # 按CPU使用率排序
M (大写) # 按内存使用率排序
N (大写) # 按PID排序
k # 杀死进程
r # 调整进程优先级(nice值)
1 # 显示每个CPU核心的使用情况
q # 退出top
4. pmap (Process Memory Map) - 进程内存映射
# 查看进程的内存映射
pmap 1234
# 显示详细信息
pmap -x 1234
# 扩展信息
pmap -XX 1234
# 示例输出:
$ pmap -x 1234
1234: /usr/sbin/mysqld
Address Kbytes RSS Dirty Mode Mapping
000055f8a4b2e000 2748 1744 0 r-x-- mysqld
000055f8a4de1000 16 16 16 r---- mysqld
000055f8a4de5000 76 60 60 rw--- mysqld
...
total kB 3284676 1256892 892344
输出字段:
- Address:内存地址
- Kbytes:内存大小(KB)
- RSS (Resident Set Size):实际使用的物理内存
- Dirty:脏页大小(已修改但未写入磁盘)
- Mode:内存权限(r=读, w=写, x=执行, s=共享, p=私有)
- Mapping:内存映射的文件或区域
二、中断管理
软中断 (Software Interrupts) vs 硬中断 (Hardware Interrupts)
查看中断信息:
# 查看/proc/interrupts文件
cat /proc/interrupts
# 查看软中断统计
cat /proc/softirqs
# 实时监控中断
watch -n 1 'cat /proc/interrupts | head -20'
区别:
- 硬中断:由硬件设备产生,需要立即处理(如键盘输入、网络包到达)
- 软中断:由内核产生,可以稍后处理(如定时器、网络数据处理)
中断相关统计:
# 查看CPU中断统计
mpstat -P ALL 1
# 查看系统统计信息
vmstat 1 5
三、进程相关工具
1. lsof (List Open Files) - 列出打开文件
# 查看进程打开的文件
lsof -p 1234
# 查看文件被哪些进程打开
lsof /var/log/syslog
# 查看端口占用
lsof -i :80
lsof -i TCP:22
# 查看用户打开的文件
lsof -u username
# 查看网络连接
lsof -i
# 常用组合:
lsof -p PID # 查看指定进程打开的文件
lsof -c process_name # 查看指定命令打开的文件
lsof +D /path/to/directory # 查看目录下被打开的文件
lsof -u ^root # 查看非root用户打开的文件
2. kill - 发送信号给进程
# 常用信号:
kill -l # 列出所有信号
# 常用信号编号和含义:
kill -1 PID # SIGHUP (1) - 挂起,重新读取配置
kill -2 PID # SIGINT (2) - 中断(同Ctrl+C)
kill -3 PID # SIGQUIT (3) - 退出并生成core文件
kill -9 PID # SIGKILL (9) - 强制杀死(无法捕获)
kill -15 PID # SIGTERM (15) - 优雅终止(默认信号)
# 使用示例:
kill 1234 # 发送SIGTERM(15)
kill -9 1234 # 强制杀死进程
kill -HUP 1234 # 重新加载配置
3. pkill (Process Kill) - 按名称杀死进程
# 按进程名杀死
pkill firefox
# 按完整命令名杀死
pkill -f "python app.py"
# 发送特定信号
pkill -9 mysql
pkill -HUP nginx
# 按用户杀死进程
pkill -u username
# 精确匹配进程名
pkill -x process_name
4. killall - 按名称杀死所有匹配进程
# 杀死所有同名进程
killall chrome
# 发送特定信号
killall -9 python
killall -HUP sshd
# 交互式确认
killall -i process_name
# 等待进程结束
killall -w process_name
5. w (Who and what) - 显示登录用户及活动
$ w
09:25:30 up 15 days, 3:35, 3 users, load average: 0.08, 0.09, 0.11
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
john pts/0 192.168.1.100 08:45 5.00s 0.05s 0.00s w
alice pts/1 192.168.1.101 09:10 15:00 0.10s 0.02s vim file.txt
bob tty1 :0 08:30 25:00 1:50 0.01s bash
输出字段:
- USER:登录用户名
- TTY:终端类型
- FROM:登录来源IP
- LOGIN@:登录时间
- IDLE:空闲时间
- JCPU:该终端所有进程使用的CPU时间
- PCPU:当前进程使用的CPU时间
- WHAT:用户当前执行的命令
四、后台进程管理
1. screen (GNU Screen) - 终端多路复用器
基本使用:
# 安装screen
sudo apt-get install screen # Debian/Ubuntu
sudo yum install screen # CentOS/RHEL
# 启动新screen会话
screen
screen -S session_name # 指定会话名称
# 会话管理快捷键(Ctrl+a后按):
# d - 分离会话(detach)
# c - 创建新窗口
# n - 下一个窗口
# p - 上一个窗口
# " - 显示窗口列表
# A - 重命名当前窗口
# k - 杀死当前窗口
# 会话管理命令:
screen -ls # 列出所有会话
screen -r session_name # 恢复会话
screen -r PID # 通过PID恢复会话
screen -X -S session_name quit # 结束指定会话
实用场景:
# 在screen中运行长时间任务
screen -S data_processing
./long_running_script.sh
# 按Ctrl+a, d 分离会话
# 稍后恢复查看进度
screen -r data_processing
2. nohup (No Hang Up) - 忽略挂起信号运行命令
基本用法:
# 运行命令并忽略挂起信号
nohup ./script.sh &
# 指定输出文件
nohup ./script.sh > output.log 2>&1 &
# 将标准错误和标准输出重定向到不同文件
nohup ./script.sh > stdout.log 2> stderr.log &
nohup.out文件说明:
- 默认行为:nohup会自动创建
nohup.out文件记录命令输出 - 文件位置:在当前目录或用户home目录(如果当前目录不可写)
- 自定义输出:可以通过重定向指定输出文件
实际应用示例:
# 后台运行Web服务器
nohup python app.py > app.log 2>&1 &
# 后台处理数据
nohup ./data_processor.sh > /var/log/data_processor.log 2>&1 &
# 检查运行状态
ps aux | grep data_processor
tail -f /var/log/data_processor.log
# 停止进程
pkill -f data_processor.sh
结合使用screen和nohup:
# 最佳实践:在screen中使用nohup
screen -S my_service
nohup ./service.sh > service.log 2>&1 &
# 按Ctrl+a, d分离
# 这样可以:
# 1. 随时查看进程输出:screen -r my_service → tail -f service.log
# 2. 进程不会因SSH断开而终止
# 3. 有完整的日志记录
五、进程管理最佳实践
1. 进程监控脚本
#!/bin/bash
# process_monitor.sh
# 监控高CPU进程
echo "=== 高CPU进程 ==="
ps aux --sort=-%cpu | head -10
# 监控高内存进程
echo -e "\n=== 高内存进程 ==="
ps aux --sort=-%mem | head -10
# 检查僵尸进程
echo -e "\n=== 僵尸进程检查 ==="
ps aux | awk '$8=="Z" {print $0}'
# 检查被占用端口
echo -e "\n=== 网络端口占用 ==="
netstat -tlnp | grep LISTEN
2. 服务管理脚本
#!/bin/bash
# service_manager.sh
SERVICE="my_app"
LOG_FILE="/var/log/${SERVICE}.log"
PID_FILE="/var/run/${SERVICE}.pid"
start_service() {
echo "启动 $SERVICE..."
nohup ./$SERVICE > $LOG_FILE 2>&1 &
echo $! > $PID_FILE
echo "服务已启动,PID: $(cat $PID_FILE)"
}
stop_service() {
if [ -f $PID_FILE ]; then
PID=$(cat $PID_FILE)
echo "停止 $SERVICE (PID: $PID)..."
kill $PID
rm -f $PID_FILE
echo "服务已停止"
else
echo "PID文件不存在,服务可能未运行"
fi
}
case "$1" in
start)
start_service
;;
stop)
stop_service
;;
restart)
stop_service
sleep 2
start_service
;;
status)
if [ -f $PID_FILE ]; then
PID=$(cat $PID_FILE)
if ps -p $PID > /dev/null; then
echo "$SERVICE 正在运行 (PID: $PID)"
else
echo "$SERVICE PID文件存在但进程未运行"
fi
else
echo "$SERVICE 未运行"
fi
;;
*)
echo "用法: $0 {start|stop|restart|status}"
exit 1
;;
esac
Comments NOTHING