09 进程管理
学习目标
- 能查看系统中正在运行的程序。
- 能结束卡住或不需要的进程。
- 能理解前台任务、后台任务和长期运行任务。
命令总览
| 命令 | 用途 | 含义 | 基本用法 | 例子 |
|---|---|---|---|---|
ps | 查看进程快照 | process status,显示当前进程状态 | ps [选项] | ps aux |
top | 实时查看进程 | 动态显示 CPU、内存和进程 | top | top |
htop | 更友好的实时进程工具 | top 的交互增强版,可能需要安装 | htop | htop |
pgrep | 查找并显示匹配进程 | 先核对 PID、名称和命令行 | pgrep [选项] 名称 | pgrep -a -x sleep |
kill | 向 PID 发送信号 | 默认发送 SIGTERM,不保证立即结束 | kill PID | kill -TERM "$pid" |
pkill | 按匹配发送信号 | 可能命中多个进程,初学练习不直接使用 | pkill [选项] 名称 | pkill -TERM -x sleep |
jobs | 查看当前 shell 后台任务 | 显示由当前终端启动的后台任务 | jobs | jobs |
fg | 后台任务切回前台 | foreground,将任务放回前台 | fg %任务号 | fg %1 |
bg | 让暂停任务后台运行 | background,将任务放到后台继续 | bg %任务号 | bg %1 |
nohup | 以忽略 SIGHUP 的方式运行命令 | & 才让 Shell 后台运行;不提供重启、健康检查或服务生命周期 | nohup 命令 >日志 2>&1 & | nohup python3 reviewed_app.py > agent-lab.log 2>&1 & |
常用场景
查看当前用户的 Python 进程线索:
pgrep -a -u "$(id -u)" -f 'python3'实时观察系统进程:
top对真实进程不要复制示例 PID 或按宽泛名称直接 pkill。先确认 PID、owner、启动时间、父进程和完整命令,再考虑信号。
让命令后台运行:
python3 reviewed_app.py &
jobs
fg %1这是交互语法参考;只有确认脚本路径、参数和副作用后才运行。主线可执行练习使用下方由当前 Shell 创建并保存 PID 的 sleep。
长期运行并保存日志:
nohup python3 reviewed_app.py > agent-lab.log 2>&1 &nohup 不负责服务治理,本课不运行这个模板。
新手注意
PID是进程编号,kill需要用 PID。- 默认
kill发送 SIGTERM,程序可以处理或忽略;发送后要等待并核验。 - SIGKILL(常写
kill -9)不可捕获,进程没有清理机会,只能在已确认对象、TERM 无效且获得授权后作为最后手段。 - procps-ng 的 pgrep/pkill 默认按进程名匹配,名称字段可能截断;
-f才匹配完整命令行。pkill可能结束多个进程,主线练习不用它。 jobs只管理当前 shell 里启动的后台任务,不等于系统所有进程。nohup主要处理 SIGHUP 与重定向,不提供重启、健康检查或服务生命周期;tmux 也不是服务管理器。
只终止自己启动的实验进程
sleep 300 &
pid=$!
ps -p "$pid" -o pid=,ppid=,user=,lstart=,comm=,args=
if [ "$(ps -o uid= -p "$pid" | tr -d ' ')" != "$(id -u)" ]; then
printf 'owner mismatch\n' >&2
exit 1
fi
kill -TERM "$pid"
if wait "$pid"; then
wait_rc=0
else
wait_rc=$?
fi
printf 'wait_rc=%s\n' "$wait_rc"
if kill -0 "$pid" 2>/dev/null; then
printf 'process still exists\n' >&2
exit 1
fiwait 对被 SIGTERM 结束的子进程通常返回非零,这是信号结果,不应被 set -e 静默截断。kill -0 只检查信号权限/进程存在性线索,PID 还可能被复用;真实服务应交给 service manager。