主题
23 · 信号、中断与进程如何结束
目标:理解信号如何打断进程、优雅退出与
kill -9的差别,并对照 systemd 停服务。
前置:17 · 进程;命令行:05、08。
1. 环境前提
bash
mkdir -p ~/lab/os1
2. 概念框(轻量课本)
| 词 | 一句话 |
|---|---|
| 中断(硬件) | 设备/定时器打断 CPU 当前工作,进入内核处理(直觉即可) |
| 信号(软件) | 内核或进程发给目标进程的异步通知:TERM、INT、KILL… |
| 默认动作 | 终止、忽略、停止、核心转储等(依信号而定) |
| 捕获(trap) | 用户态注册处理函数,收到信号时跑清理逻辑 |
常用信号:
| 信号 | 典型来源 | 默认 |
|---|---|---|
SIGINT (2) | Ctrl+C | 终止 |
SIGTERM (15) | kill PID、systemctl stop | 终止(可被捕获) |
SIGKILL (9) | kill -9 | 不能捕获,强杀 |
SIGHUP (1) | 终端挂断;守护进程常用来重载配置 | 视程序 |
text
systemctl stop mini-api
→ 向主进程发 SIGTERM
→ 进程清理后退出
→ 若超时仍活着 → 可能升级为 SIGKILL(视 unit 配置)1
2
3
4
2
3
4
3. 动手:trap 与 kill
bash
cat > ~/lab/os/trap-demo.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
cleanup() {
echo "caught signal, cleaning up..."
exit 0
}
trap cleanup TERM INT
echo "pid=$$ send: kill -TERM $$ or press Ctrl+C"
while true; do sleep 1; done
EOF
chmod 755 ~/lab/os/trap-demo.sh1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
终端 A:
bash
~/lab/os/trap-demo.sh1
终端 B:
bash
kill -TERM <A的pid>
# 应看到 cleaning up1
2
2
对比强杀:
bash
~/lab/os/trap-demo.sh &
PID=$!
sleep 1
kill -9 "$PID"
# 无 cleanup;直接没了
wait "$PID" 2>/dev/null || true1
2
3
4
5
6
2
3
4
5
6
systemctl 对照(有 mini-api 时):
bash
sudo systemctl stop mini-api
sudo journalctl -u mini-api -n 20 --no-pager
sudo systemctl start mini-api1
2
3
2
3
4. 与命令行篇对照
| 05 / 08 / 14 | OS 视角 |
|---|---|
kill PID | 默认 SIGTERM |
kill -9 | SIGKILL,跳过清理 → 可能留锁文件、半截写 |
systemctl stop | 有超时与信号升级策略的「文明停机」 |
| healthcheck 里 restart | stop/start 或 restart 背后仍是信号 + 再拉起 |
5. 阶段 C 收束
你现在应能把命令行与 OS 对上号:
text
敲命令 → syscall(16)
进程/线程/调度(17~18)→ 内存 RSS/OOM(19)
文件与 inode(20)→ fd 与管道(21)
socket 与端口(22)→ 信号结束进程(23)1
2
3
4
2
3
4
回到运维:排查时先选对「层」——是进程没了、内存杀了、磁盘满了、端口没听,还是信号没处理干净。
6. 动手清单
- [ ] 跑
trap-demo.sh,用SIGTERM看到 cleanup - [ ] 用
SIGKILL对比无 cleanup - [ ] 口述:
systemctl stop为何优于习惯性kill -9 - [ ] (可选)读某服务 unit 的
TimeoutStopSec=/KillMode=
7. 常见翻车
| 翻车 | 处理 |
|---|---|
生产首选 -9 | 先 TERM,等日志与退出码;再考虑强制 |
| 忽略信号导致 stop 很慢 | 修应用处理 TERM;或调 unit 超时(需权衡) |
后台脚本不 trap | 被 kill 时临时文件残留 |
8. 官方 / 延伸
man 7 signal、man kill、help trap- signal(7)
- 系列目录:
linux/README.md
阶段 C 到此结束。命令行 01~15 与 OS 16~23 可按 README 交叉阅读地图反复对照。
