第 3 章 · 02 进程、系统调用与 systemd


文档摘要

第 3 章 · 02 进程、系统调用与 systemd 本节摘要:本节进入 Linux 的"运行时"层面:进程六状态与信号机制、僵尸进程的清理、用户态与内核态、系统调用(fork/exec/wait/pipe)如何工作,然后是现代服务管理核心 systemd 与 SSH 远程管理,最后是内核模块与运行时参数。学完本节,你能管理进程生命周期、创建系统服务、排查 SSH 故障。 学习目标 说出进程六状态与三个核心信号,并能清理僵尸进程。 解释 fork/exec/wait 分工与"exec 成功后永不返回"。 说出 systemd 服务创建的完整流程。 解释 SSH 密钥机制与 "Host key verification failed" 的原因。

第 3 章 · 02 进程、系统调用与 systemd

本节摘要:本节进入 Linux 的"运行时"层面:进程六状态与信号机制、僵尸进程的清理、用户态与内核态、系统调用(fork/exec/wait/pipe)如何工作,然后是现代服务管理核心 systemd 与 SSH 远程管理,最后是内核模块与运行时参数。学完本节,你能管理进程生命周期、创建系统服务、排查 SSH 故障。

学习目标

  1. 说出进程六状态与三个核心信号,并能清理僵尸进程。
  2. 解释 fork/exec/wait 分工与"exec 成功后永不返回"。
  3. 说出 systemd 服务创建的完整流程。
  4. 解释 SSH 密钥机制与 "Host key verification failed" 的原因。
  5. 说出用户态与内核态的区别及 sysctl 的用途。

一、进程状态与信号

进程六状态

状态 含义
R 运行中
S 可中断睡眠
D 不可中断睡眠(等 I/O;任何信号都杀不掉,只能重启)
T 停止
Z 僵尸(已结束但未被父进程回收)
X 死亡

信号表

信号 编号 行为
SIGHUP 1 常用于重载配置
SIGINT 2 Ctrl+C
SIGTERM 15 kill 默认信号,优雅终止(可捕获、可保存状态)
SIGKILL 9 强制终止,不可捕获/忽略(最后手段)
SIGCHLD 17 子进程退出通知父进程

kill 细节:kill -l 列全部信号;kill 0 发给当前进程组全部进程;kill -0 <PID> 仅探测进程是否存在;trap 在 shell 中拦截信号执行自定义动作。

僵尸进程

产生:子进程已结束,但父进程未调用 wait() 回收其退出状态。

清理三步:

ps 定位僵尸及其父进程 kill -s SIGCHLD <父PID> # 通知父进程"收尸" # 无效则杀掉父进程 → 僵尸被 init(PID 1)收养后周期清理

注意:僵尸进程本身无法被 kill -9——它已经死了,只是没被"收尸"。

其他概念

  • init:内核启动的第一个进程,所有进程之父(PID 1);
  • daemon:常驻后台守护进程(sshd/crond/rpcbind);
  • 孤儿进程:父先亡,被 init 收养;
  • nice:调整优先级,-20(最高)~19(最低),值越高优先级越低;
  • 调试:strace 跟踪系统调用、ltrace 跟踪库调用。

二、系统调用:用户态进入内核态的通道

用户态 vs 内核态:内核运行在受保护的内核空间,可访问全部硬件;用户程序在用户空间,只能经系统调用间接访问资源。

机制:程序执行 trap 指令 → 特权级提升进入内核 → 完成特权操作 → return-from-trap 降权返回。

核心调用表:

调用 作用 关键行为
fork() 克隆当前进程建子进程 父得子 PID、子得 0、失败父得 -1(如内存不足)
exec() 用新程序替换当前映像 成功后永不返回
wait() 等待子进程结束并回收 不 wait 产生僵尸;waitpid 可非阻塞
pipe() 单向 IPC 通道 返回读端/写端两个 fd
open/read/write/close 文件 I/O open 返回 fd,之后用 fd 而非路径

命令执行流程:PATH 定位可执行文件 → fork() 建子进程 → exec() 执行 → wait() 等待 → 完成后重新打印提示符。

为什么 fork+exec 分离? 因为 fork 后 exec 前可以插入代码(改环境、做重定向)——单调用 API 无法实现。

三、systemd 服务管理

systemd(system daemon)直接位于内核之上:Hardware → Kernel → Daemons/系统库/显示服务。

创建服务四步

  1. /etc/systemd/system/<name>.service 写 unit 文件:
[Unit] Description=我的服务 WantedBy=multi-user.target [Service] ExecStart=/usr/local/bin/myapp [Install] WantedBy=multi-user.target
  1. systemctl daemon-reload 重载配置;
  2. systemctl enable --now <name> 开机自启+立即启动;
  3. journalctl -u <name> 查看日志。

命令族

命令 作用
systemctl start/stop/restart/status <svc> 服务生命周期
systemctl enable/disable <svc> 开机自启管理
journalctl -f 跟随日志;-u 按 unit 过滤

对照:SysV init(service 命令、/etc/inittab、update-rc.d)→ systemd(systemctl、并行启动、日志一体化)。

四、SSH 远程管理

SSH(Secure Shell):加密网络协议;优于 telnet(明文传输,密码可被窃听)。

密钥机制:客户端生成公私钥对——私钥留本地(id_rsa),公钥分发到服务器 authorized_keys;known_hosts 存服务器公钥指纹,建立信任、防中间人。

常用命令:ssh user@hostssh-keygen -t rsa -b 4096(生成)、ssh-keygen -l -f(查看位数/指纹)、scp/rsync(传文件)。

故障排查:

报错 原因 处理
Host key verification failed 服务器公钥与 known_hosts 记录不符(重装/换钥/中间人) 确认后清理 known_hosts 对应行
connection refused SSH 服务未装/未运行 systemctl status sshd
permission denied 密钥未部署或权限过宽 检查 authorized_keys 与权限

五、内核与运行时参数

  • 内核职责:分配内存、调度进程、控制 CPU;uname -a 查版本;
  • 内核模块:可动态加载进内核的代码片段(驱动/文件系统/系统调用),无需重启扩展;
  • 配置三时机:编译时、启动时、运行时;
  • sysctl:列出/修改运行时参数(sysctl -a),实质是改 /proc/sys/... 下的文件;
  • IPv4 转发:sudo sysctl net.ipv4.ip_forward=1,持久化写入 /etc/sysctl.conf;
  • 容器隔离:容器有独立 /proc,容器内改内核参数不影响宿主机。

六、本章自测(原库陷阱题)

  1. D 状态的进程 kill -9 能杀掉吗?(不能,不可中断 I/O,只能重启)
  2. 僵尸进程如何产生与清理?(父未 wait;SIGCHLD 通知/杀父进程)
  3. exec() 成功后会怎样?(永不返回)
  4. systemd 服务开机自启用什么命令?(systemctl enable)
  5. 为什么 SSH 比 telnet 安全?(加密传输,防窃听)

小结

  • 进程六态:R/S/D/T/Z/X,D 态杀不掉;僵尸靠 SIGCHLD 或杀父解决。
  • 信号铁律:SIGTERM 优雅、SIGKILL 强杀、SIGHUP 重载。
  • 系统调用链:fork 克隆 → exec 替换 → wait 回收;trap 指令是提权入口。
  • systemd 四步:unit 文件 → daemon-reload → enable --now → journalctl。
  • SSH 故障三查:指纹不符清 known_hosts、拒连查服务、拒绝查密钥。

下一节预告:文件与进程都会了,最后一层——存储、网络与性能排障。


发布者: 作者: 灏天文库 转发
评论区 (0)
U