09 进程管理

学习目标

  • 能查看系统中正在运行的程序。
  • 能结束卡住或不需要的进程。
  • 能理解前台任务、后台任务和长期运行任务。

命令总览

命令用途含义基本用法例子
ps查看进程快照process status,显示当前进程状态ps [选项]ps aux
top实时查看进程动态显示 CPU、内存和进程toptop
htop更友好的实时进程工具top 的交互增强版,可能需要安装htophtop
pgrep查找并显示匹配进程先核对 PID、名称和命令行pgrep [选项] 名称pgrep -a -x sleep
kill向 PID 发送信号默认发送 SIGTERM,不保证立即结束kill PIDkill -TERM "$pid"
pkill按匹配发送信号可能命中多个进程,初学练习不直接使用pkill [选项] 名称pkill -TERM -x sleep
jobs查看当前 shell 后台任务显示由当前终端启动的后台任务jobsjobs
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
fi

wait 对被 SIGTERM 结束的子进程通常返回非零,这是信号结果,不应被 set -e 静默截断。kill -0 只检查信号权限/进程存在性线索,PID 还可能被复用;真实服务应交给 service manager。

参考资料