第 10 章:进程、任务、信号、日志与服务
建议学时:2 小时|状态:普通用户实验可复现
学习目标
- 查看和停止自己启动的进程;
- 理解前台、后台、PID 与信号;
- 使用 journalctl/systemctl 读取服务状态。
概念图
概念图 / 文本
命令 → 进程/PID → 状态与信号 → 标准输出/日志 → 退出码进程
Ubuntu Bash
ps -ef | head
ps aux | head
sleep 300 &
job_pid=$!
printf 'pid=%s\n' "$job_pid"
jobs
ps -p "$job_pid" -o pid,ppid,stat,cmd
kill "$job_pid"
wait "$job_pid" 2>/dev/null& 把命令放到后台;$! 是最近后台进程 PID。默认 kill 发送 TERM,请进程正常退出。不要一开始就用 KILL(-9),它不给进程清理机会。
交互控制
Ctrl+C:向前台进程发送中断;Ctrl+Z:暂停;bg:在后台继续;fg:调回前台。
服务与日志
现代 WSL 支持 systemd,但发行版配置可能不同:
Ubuntu Bash
ps -p 1 -o comm=
systemctl --no-pager --failed
journalctl -b --priority=warning --no-pager | tail -n 30读取状态通常不需要 sudo;启动、停止系统服务会改变环境,本章不执行。Docker Desktop 引擎也不是由 Ubuntu 中普通 systemctl 命令管理的。
实验:从 PID 到日志思维
启动一个短任务,将输出和错误分别保存,然后验证退出码:
Ubuntu Bash
(printf 'start\n'; sleep 1; printf 'done\n') > notes/job.log 2> notes/job.err
status=$?
printf 'exit=%s\n' "$status"
cat notes/job.log预期结果:显示 exit=0,job.log 包含 start 与 done,而 job.err 为空。
故障分支
- 进程“杀不掉”:先确认 PID 和所有者;不要杀不认识的系统进程。
systemctl报 systemd 未运行:检查 PID 1 和 WSL 配置,不安装随机替代工具。- 日志为空:确认时间范围、服务名和当前启动周期。
自测
- TERM 与 KILL 的区别是什么?
$!表示什么?- 为什么 Docker Desktop 不应直接当成 Ubuntu systemd 服务?
答案见答案索引。