第 3 章 · 02 进程、系统调用与 systemd 本节摘要:本节进入 Linux 的"运行时"层面:进程六状态与信号机制、僵尸进程的清理、用户态与内核态、系统调用(fork/exec/wait/pipe)如何工作,然后是现代服务管理核心 systemd 与 SSH 远程管理,最后是内核模块与运行时参数。学完本节,你能管理进程生命周期、创建系统服务、排查 SSH 故障。 学习目标 说出进程六状态与三个核心信号,并能清理僵尸进程。 解释 fork/exec/wait 分工与"exec 成功后永不返回"。 说出 systemd 服务创建的完整流程。 解释 SSH 密钥机制与 "Host key verification failed" 的原因。
本节摘要:本节进入 Linux 的"运行时"层面:进程六状态与信号机制、僵尸进程的清理、用户态与内核态、系统调用(fork/exec/wait/pipe)如何工作,然后是现代服务管理核心 systemd 与 SSH 远程管理,最后是内核模块与运行时参数。学完本节,你能管理进程生命周期、创建系统服务、排查 SSH 故障。
| 状态 | 含义 |
|---|---|
| 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——它已经死了,只是没被"收尸"。
用户态 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(system daemon)直接位于内核之上:Hardware → Kernel → Daemons/系统库/显示服务。
/etc/systemd/system/<name>.service 写 unit 文件:[Unit] Description=我的服务 WantedBy=multi-user.target [Service] ExecStart=/usr/local/bin/myapp [Install] WantedBy=multi-user.target
systemctl daemon-reload 重载配置;systemctl enable --now <name> 开机自启+立即启动;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(Secure Shell):加密网络协议;优于 telnet(明文传输,密码可被窃听)。
密钥机制:客户端生成公私钥对——私钥留本地(id_rsa),公钥分发到服务器 authorized_keys;known_hosts 存服务器公钥指纹,建立信任、防中间人。
常用命令:ssh user@host、ssh-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 与权限 |
uname -a 查版本;sysctl -a),实质是改 /proc/sys/... 下的文件;sudo sysctl net.ipv4.ip_forward=1,持久化写入 /etc/sysctl.conf;下一节预告:文件与进程都会了,最后一层——存储、网络与性能排障。