进程管理与系统监控

目录

进程管理与系统监控

理论讲解

1. 什么是进程?

  • 运行中的程序:你启动的每个命令、服务、脚本都是一个进程
  • 父子关系:进程可以创建子进程(比如Shell启动Python脚本)
  • 后台 vs 前台:前台进程占用终端,后台进程在背后运行

2. 重要性

  • AI训练:训练模型可能运行几天,需要放到后台,并能随时查看状态
  • 嵌入式:编译大型项目时,需要监控CPU/内存使用
  • 调试:程序“卡住”或崩溃时,需要找到并结束它
  • 服务器管理:监控系统资源,防止过载

代码

查看进程

# 1. 最简单的进程查看
ps

# 2. 查看当前终端的所有进程
ps -f

# 3. 查看系统所有进程(最常用!)
ps aux

# 4. 用树状结构查看进程关系
pstree

理解 ps aux 输出:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mzt2006   1234  0.5  2.1  18564  8436 pts/0    Ss   10:30   0:00 -bash
mzt2006   5678 98.5 45.2 8.7G   3.2G  pts/0    R+   11:15  15:30 python train.py
  • PID:进程ID(唯一标识)
  • %CPU:CPU占用百分比
  • %MEM:内存占用百分比
  • COMMAND:进程名/命令

进程控制

# 1. 启动一个长时间运行的“模拟AI训练”
echo "模拟AI训练脚本..."
cat > simulate_ai_training.sh << 'EOF'
#!/bin/bash
echo "AI训练开始于: $(date)"
for i in {1..30}; do
    echo "Epoch $i/30 - Loss: 0.$((RANDOM % 999))"
    sleep 2  # 模拟耗时计算
done
echo "训练完成!"
EOF

chmod +x simulate_ai_training.sh

# 2. 在前台运行(会占用终端)
./simulate_ai_training.sh
# 按 Ctrl+C 中断它

后台进程管理

# 1. 在后台运行(& 符号)
./simulate_ai_training.sh > training.log 2>&1 &

# 2. 查看后台作业
jobs

# 3. 查看这个后台进程的PID
ps aux | grep simulate_ai

# 4. 把后台作业调回前台
fg %1  # %1 是jobs显示的作业号

# 5. 再次放到后台(先按 Ctrl+Z 暂停,然后)
bg %1

结束进程

# 1. 启动一个测试进程
sleep 300 &

# 2. 查看它的PID
ps aux | grep sleep

# 3. 用不同方式结束它
kill PID              # 优雅终止(发送SIGTERM)
kill -9 PID           # 强制杀死(SIGKILL,最后手段)
pkill sleep           # 按进程名结束
killall sleep         # 结束所有同名进程

系统监控

# 1. 动态监控进程(类似Windows任务管理器)
top

# 2. 更强大的监控(需要安装)
# sudo apt install htop
htop

# 3. 查看内存使用
free -h

# 4. 查看磁盘使用
df -h

# 5. 查看最耗CPU的进程
ps aux --sort=-%cpu | head -10

# 6. 查看最耗内存的进程
ps aux --sort=-%mem | head -10

实际应用场景

场景1:AI训练监控

# 启动训练(后台,输出到日志)
python train.py --epochs=100 > train.log 2>&1 &

# 实时查看训练日志
tail -f train.log

# 监控GPU使用(如果有NVIDIA GPU)
nvidia-smi
# 或持续监控
watch -n 1 nvidia-smi

场景2:嵌入式编译优化

# 编译大型项目,监控资源
make -j4 all  # 用4个核心并行编译

# 在另一个终端查看编译进程
watch -n 1 "ps aux | grep make | grep -v grep"

信号(Signals)概念

常用信号:

kill -l          # 列出所有信号

# 常用信号编号:
# 1) SIGHUP    - 挂起(重新加载配置)
# 2) SIGINT    - 中断(Ctrl+C)
# 9) SIGKILL   - 强制杀死(无法捕获)
# 15) SIGTERM  - 优雅终止(默认)
# 18) SIGCONT  - 继续运行
# 19) SIGSTOP  - 暂停(Ctrl+Z)

信号使用示例:

# 优雅地让进程重新读取配置文件
kill -1 PID      # 发送SIGHUP,nginx/apache会重载配置

# 暂停进程
kill -19 PID     # SIGSTOP

# 恢复暂停的进程
kill -18 PID     # SIGCONT